python 网络编程
1,什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,一条
线程指的是进程中一个单一个顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务
简单的讲,是操作系统最小的调度单位,是一串指令的集合
2,进程
好比 QQ吧 要以一个整体的形式暴露给操作系统(OS)管理,里面包含对各种资源的调用,内存的管理
,网络接口的调用等。。
进程 要操作CPU,必须要先创建一个线程,进程本身是不可以执行的,进程只是一个房子而已 里面有一堆干活的线程
进程:对各种资源管理的集合, 就可以成为 进程
t=threading.Thread(target=函数名,arges=(参数,)) 声明一个线程
t.start() 开启线程
threading.current_thread()获取当前线程信息,
threading.active_count()当前活跃的进程数
t.join() 等待线程结束在继续执行
主线程和子线程是并行运算的
守护线程 一个主进线程可以生成很多守护线程,
在一个程序中大量使用锁的话 一定要使用递归锁防止锁死
生产者消费者模型,可解决大部分并发的程序
queue 队列 简介:
其实就是放一堆数据的盒子
gevent 协程概念
就是在单核,单线程的下实现并发操作,其实还是串行,只不过由于CPU处理快,协程跳的比较快 所以给人错觉是并行运算,
io操作不占用CPU
计算占用CPU ,1+1等
python 多线程 不适合CPU密集型的任务,适合IO操作密集型的任务
先上一个多线程的socket 支持多用户
import socketserver # 想要使用socketserver 必须要定义一个类 并且继承socketserver.BaseRequestHandler class Myserver(socketserver.BaseRequestHandler): # 这个方法就是父亲的,每链接一个对象就会调用一个handle def handle(self): # self.request == conn self.client_address == address self.server conn=self.request conn.sendall(bytes('欢迎光临',encoding='utf-8')) while True: ret_bytes=conn.recv(1024) ret_str=str(ret_bytes,encoding='utf-8') if ret_str =='q': break print(ret_str,self.client_address) conn.sendall(bytes(ret_str+'你好',encoding='utf-8')) if __name__ == '__main__': server=socketserver.ThreadingTCPServer(('127.0.0.1',9999),Myserver) server.serve_forever() #他就是一个循环不停接收,他可以并发
再来个牛逼的支持上万个并发的(需要配置达得到)
""" 这模块很强大 ,它会监测操作系统 如果支持epoll 它会优先使用epoll 系统不支持 那他就会使用select """ sel=selectors.DefaultSelector() # 建立连接 def accept(sock,mask): conn,addr=sock.accept()#接收连接 print('accepted:',conn,',from:',addr) conn.setblocking(False)#设置非阻塞模式 sel.register(conn,selectors.EVENT_READ,read)#注册事件,如果客户端发消息就会执行read了 def read(conn,mask): try: data=conn.recv(1024) if data: print('echoing',repr(data),'to',conn) conn.send(data) else: print('closing',conn) sel.unregister(conn)#取消注册 conn.close() except Exception as e: print(e) sel.unregister(conn) # 取消注册 conn.close() sock=socket.socket() sock.bind(('127.0.0.1',1000)) sock.listen(10000) sock.setblocking(False) #设置为非阻塞 sel.register(sock,selectors.EVENT_READ,accept)#注册事件,意思是只要来了新连接就调用accept函数 while True: events=sel.select()#这个有可能调用select 也有可能是epoll,默认是阻塞的,有活动的连接就返回活动的连接列表 # 循环活动的连接列表 for key,mask in events: # callback=key.data#回调函数 回调accept callback(key.fileobj,mask)#fileobje 文件句柄,就是还没建立好的连接
                    
                
                
            
        
浙公网安备 33010602011771号