协程:非抢占式进程
优点:占用资源少,效率高,可以同时在应用层完成多个任务
缺点:无法利用计算机多核
协程模块:【1】greenlet
greenlet.greenlet(func)
功能: 创建协程对象
参数:协程函数
g.switch()
功能: 选择执行的协程
【2】gevent
gevent.spawn(func,argv,...)
功能 : 生成协程对象
参数 : func 协程函数
argv 协程函数参数
返回值: 协程对象
gevent.joinall(list,[timeout])
功能: 阻塞等待协程执行完毕
参数: list 协程对象列表
gevent.sleep(sec)
功能: gevent睡眠阻塞
* gevent协程只有遇到gevent标记的阻塞行为才会自动跳转
3. monkey插件 (day9/gevent_server)
功能:使普通的pythonIO阻塞行为变为可以触发gevent协程阻塞的行为
使用: from gevent import monkey
在模块导入前,运行响应的monkey插件函数
以下是使用gevent模块实现的:
import gevent
from gevent import monkey
monkey.patch_all() #需要在导入socket模块之前执行
from socket import*
#创建套接字
s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)
#绑定地址
s.bind(('0.0.0.0',9610))
#设置监听
s.listen(10)
#循环连接
while True:
c,addr=s.accept()
print("Connect from",addr)
gevent.spawn(handle,c) #协程方案
s.close()
#循环收发消息:
def handle(c):
while True:
data=c.recv(1024)
if not data:
break
print(data.decode())
c.send(b'OK')
以上使用协程进行工作的并发客户端就创建完成了!!!