1、gevent库可以轻松实现并发同步或异步编程。gevent中使用的主要模式是Greenlet,它是以C扩展模块的形式访问Python的轻量级协程。
2、Greenlet全部运行在主程序操作系统的过程中,但是它们是协作调度的。
安装gevent库:
pip install gevent
示例代码1:
from gevent import monkey # 为了能识别time模块的io
monkey.patch_all() # 必须放到被打补丁者的前面,如 time,socket 模块之前
import gevent
import time
def gf(name):
print(f'{name}:我想打王者!!')
# gevent.sleep(2)
time.sleep(2)
print(f'{name}:我想吃大餐!!!')
def bf(name):
print(f'{name}:一起打!!!')
# gevent.sleep(2)
time.sleep(2)
print(f'{name}:一快去吃!!')
if __name__ == "__main__":
start = time.time()
# 创建协程对象
g1 = gevent.spawn(gf, '张三')
g2 = gevent.spawn(bf, '李四')
# 开启任务
g1.join()
g2.join()
end = time.time()
print(end - start)
运行结果:
示例代码2:
import gevent
def foo():
print('Running in foo')
gevent.sleep(2)
print('Explicit context switch to foo again')
def bar():
print('Explicit context to bar')
gevent.sleep(2)
print('Implicit context switch back to bar')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
运行结果:
示例代码3: 【程序准确性待检查】
from gevent import monkey, socket, pool
monkey.patch_all()
def server(port, pool):
s = socket.socket()
s.bind(('0.0.0.0', port))
s.listen()
while True:
cli, addr = s.accept()
print("Welcome %s to SocketServer" % str(addr[0]))
# 通过pool.spawn()运行协程
pool.spawn(handle_request, cli)
def handle_request(conn):
try:
data = conn.recv(1024)
print("recv:", data)
data = "From SockeServer:192.168.1.1---%s" % data.decode("utf-8")
conn.sendall(bytes(data, encoding='utf-8'))
if not data:
conn.shutdown(socket.SHUT_WR)
except Exception as e:
print(e)
finally:
conn.close()
if __name__ == '__main__':
# 限制并发协程数量为5
pool = pool.Pool(5)
server(80, pool)
参考博文:
Python基础教程——多协程并发——gevent
Python中Gevent的使用-Python学习网
python —— gevent详解(二) 协程、进程、线程_胖虎是只mao的博客-CSDN博客_python中gevent
Python并发Gevent库(一)_肥宅_Sean的博客-CSDN博客
python3通过gevent.pool限制协程并发数量 - chengd - 博客园