协程:
定义:纤程、微线程。本质上只有一个线程在运行
原理:通过应用层记录程序的上下文栈区,实现程序运行中的跳跃。进而实现选择代码段执行。
优点: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多路复用也可以解决,多客户连接问题
>协程也可以解决,协程是单进程,它的工作主要是通过,选择可执行代码段,不阻塞在,阻塞语句