大锤python日记(协程之使用gevent完成多任务)
使用gevent
完成多任务案例:
from gevent import monkey; monkey.patch_all() # 添加补丁
import gevent
import time
def task(name, delay):
"""定义一个任务函数,接收两个参数,分别为任务名称和等待时间"""
while True:
print(f"{name} is running") # 打印任务名称
time.sleep(delay) # 等待一段时间
gevent.idle() # 让出CPU
# 创建三个Greenlet对象,分别对应三个任务,同时传递不同的参数
gr1 = gevent.spawn(task, "Task 1", 1)
gr2 = gevent.spawn(task, "Task 2", 2)
gr3 = gevent.spawn(task, "Task 3", 3)
# 等待所有任务运行完毕
gevent.joinall([gr1, gr2, gr3])
在这个案例中,我们首先添加了monkey.patch_all()
调用,来自动为所有需要进行协程切换的标准库方法打上补丁。这样一来,我们就可以在协程中使用time.sleep()
等标准库的阻塞方法了。
接着,我们定义了一个任务函数task()
,它接收两个参数:任务的名称和等待时间。在函数内部,我们打印出任务的名称,并等待指定的时间。同时,我们使用gevent.idle()
方法让出CPU,以便其他协程有机会执行。
然后,我们创建三个Greenlet
对象gr1
、gr2
和gr3
,并使用gevent.spawn()
方法将task()
函数转换为这些协程。同时,我们传递不同的参数给每个任务,来控制它们的等待时间和输出内容。
最后,我们使用gevent.joinall()
方法等待所有任务运行完毕。这个方法会阻塞当前线程,直到所有协程都执行完毕。
需要注意的是,gevent
实现协程的方式与greenlet
略有不同,它将协程封装在Greenlet
对象中,并提供了更多的控制方法和工具函数。如果需要实现复杂的协程切换和并发处理,可以考虑使用gevent
库。
转载自:https://juejin.cn/post/7218023140034641979