实验环境
- 5线程,5协程,模拟2秒阻塞。
- 线程使用threading模块。
asyncio
import asyncio
from threading import Thread
from time import time
async def task(j):
print(f'{j}开始')
await asyncio.sleep(2)
print(f'{j}结束')
async def rank():
tasks = []
for j in range(5):
tasks.append(asyncio.create_task(task(j)))
await asyncio.wait(tasks)
def main():
asyncio.run(rank())
if __name__ == '__main__':
start = time()
t_list = []
for i in range(5):
t = Thread(target=main)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(f'总共{time() - start}秒')
总共2.0095505714416504秒
gevent
from gevent import monkey
monkey.patch_all()
# 猴子补丁
import gevent
from threading import Thread
from time import sleep, time
def task(j):
print(f'{j}开始')
sleep(2)
print(f'{j}结束')
def main():
g_list = []
for j in range(5):
g_list.append(gevent.spawn(task, j))
gevent.joinall(g_list)
if __name__ == '__main__':
start = time()
t_list = []
for i in range(5):
t = Thread(target=main)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(f'总共{time() - start}秒')
总共2.019617795944214秒
gevent的一些方法
gevent.spawn() | 创建一个普通的Greenlet对象并切换 |
gevent.spawn_later(seconds=3) | 延时创建一个普通的Greenlet对象并切换 |
gevent.spawn_raw() | 创建的协程对象属于一个组 |
gevent.getcurrent() | 返回当前正在执行的greenlet |
gevent.joinall(jobs) | 将协程任务添加到事件循环,接收一个任务列表 |
gevent.wait() | 可以替代join函数等待循环结束,也可以传入协程对象列表 |
gevent.kill() | 杀死一个协程 |
gevent.killall() | 杀死一个协程列表里的所有协程 |
monkey.patch_all() | 非常重要,会自动将python的一些标准模块替换成gevent框架 |