"""
协程:
gevent(monkey脚本)
1.生成协程对象 gevent.spawn(func,argv)
2.阻塞等待协程执行完毕 gevent.joinall(list,[timeout]) list:协程对象列表
3.gevent睡眠阻塞 gevent.sleep(second)
4.gevent协程只有在遇到gevent指定的阻塞行为时才会自动在协程之间进行跳转
如gevent.joinall(),gevent.sleep()带来的阻塞
monkey:
gevent提供了一个脚本程序monkey,可以修改底层解释IO阻塞的行为,讲很多普通阻塞转换为gevent阻塞
1.导入monkey from gevent import monkey
2.运行相应的脚本,如转换socket中所有的阻塞 monkey.patch_socket()
3.如果将所可转换的IO阻塞全部转换则运行all monkey.patch_all()
4.脚本运行函数需要在对应模块导入前执行
"""
from gevent import monkey
monkey.patch_time()
import gevent
from time import sleep
def fun1(a, b):
print("run fun1", a, b)
sleep(2)
print("again run fun1")
def fun2():
print("run fun2...")
gevent.sleep(3)
print("again run fun2...")
g = gevent.spawn(fun1, 3, 4)
f = gevent.spawn(fun2)
gevent.joinall([g,f])
"""========================================================"""
"""
基于TCP并发实现协程
1.将每个客户端的处理设置为协程函数
2.让socket模块下的阻塞可以触发协程跳转
"""
import gevent
from gevent import monkey
monkey.patch_socket()
from socket import *
import sys
def handle(val):
while True:
data = val.recv(1024).decode()
if not data:
break
print("c>>",data)
val.send(b'ON')
soc = socket(AF_INET, SOCK_STREAM)
soc.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
soc.bind(('127.0.0.1', 9090))
soc.listen(3)
while True:
print("wait client connect...")
try:
c, addr = soc.accept()
print("connect from port", addr)
except KeyboardInterrupt:
sys.exit()
except Exception as a :
print(a)
continue
gevent.spawn(handle,c)