基于UDP的套接字编程
udp是无链接的,先启动哪一端都不会报错并发
socket.SOCK_DGRAM 数据报协议socket
udp不会发送空数据,什么都不输入直接发送也会有报头发过去tcp
服务端spa
import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8080)) while True: data,client_addr = server.recvfrom(1024) print(data) server.sendto(data.upper(),client_addr) 客户端 import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg = input('>>:') client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) data,server_addr = client.recvfrom(1024) print(data)
socketserver模块
使用socketserver类实现基于tcp的并发编程操作系统
import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): # 通讯循环 while True: try: data = self.request.recv(1024) if len(data) == 0: break self.request.send(data.upper()) except ConnectionRefusedError: break self.request.close() if __name__ == '__main__': s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True) s.serve_forever() # 表明链接循环 # 循环创建链接,每创建一个链接就会启动一个线程(服务员),专门与刚刚创建好的链接作通讯循环
使用socketserver类实现基于udp的并发编程线程
import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): # 通讯循环 print(self.__dict__) print(self.client_address) print(self.request) data = self.request[0] print('客户消息', data) self.request[1].sendto(data.upper(), self.client_address) if __name__ == '__main__': s = socketserver.ThreadingUDPServer(('127.0.0.1', 8081), MyHandler) s.serve_forever()
进程code
1.什么是进程?server
进程指的是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念blog
进程是起源于操做系统的,是操做系统最核心的概念,操做系统全部其余的概念都是围绕进程展开的
2.为什么要进程?
并发
3.如何用进程?
开启进程的两种方式
操做系统原理
1.串行:一个任务完完整整地运行完毕后,才能运行下一个任务
2.并发:看起来多个任务是同时运行的便可,单核也能够实现并发
3.并行:真正意义上多个任务同时运行,只有多核才能实现并行
4.cpu的功能:cpu是用来作计算的,cpu是没法执行IO操做的,一旦遇到io操做,应该去执行别的任务
5.多道技术:
①空间上的复用==》多个进程共用一个内存条
②时间上的复用==》多个进程复用同一个cpu的时间
cpu遇到IO切换:能够提高效率
一个进程占用cpu时间过长也会切走:为了实现并发效果不得已而为之,反而会下降程序的执行效率