协程
协程:
定义:纤程、微线程。本质上只有一个线程在运行
原理:通过应用层记录程序的上下文栈区,实现程序运行中的跳跃。进而实现选择代码段执行。
优点:1、无需多线程切换的开销
2、资源消耗非常小
3、无需进行同步互斥操作
4、对IO并发性极好
缺点:
1、无法利用计算机多核资源
2、如果程序阻塞,会阻塞整个进程运行
import gevent def foo(a): print('running in foo',a) gevent.sleep(4) print('switch to foo again') def bar(): print('running in bar') gevent.sleep(3) print('switch to bar again') #将事件加入协程 f=gevent.spawn(foo,1) b=gevent.spawn(bar) gevent.joinall([f,b])
yangrui@ubuntu:~/day10$ python3 gevent_test.py
running in foo 1
running in bar
switch to bar again
switch to foo again
import gevent from gevent import monkey #在导入socket前执行,改变socket的阻塞形态 monkey.patch_all() from socket import * from time import ctime def server(port): s=socket() s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind(('0.0.0.0',port)) s.listen(5) while True: c,addr=s.accept() print(addr) gevent.spawn(handler,c)#不阻塞,使循环继续接收新的客户端链接 #处理客户端事件 def handler(c): while True: print('--------------')#打印 data=c.recv(1024).decode()#阻塞等待接收 print('==============')#不打印 if not data: break print('recvied:',data) c.send(ctime().encode()) c.close() if __name__=='__main__': server(8000)
>tcp套接字接受客户端发送数据;不能接受多个客户端连接,由于是单进程,会阻塞在recv()函数
>多进程可以解决,多客户端连接问题,但多进程消耗资源较大;
>io多路复用也可以解决,多客户连接问题
>协程也可以解决,协程是单进程,它的工作主要是通过,选择可执行代码段,不阻塞在,阻塞语句