likes
comments
collection
share

大锤python日记(协程之使用gevent完成多任务)

作者站长头像
站长
· 阅读数 17

使用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对象gr1gr2gr3,并使用gevent.spawn()方法将task()函数转换为这些协程。同时,我们传递不同的参数给每个任务,来控制它们的等待时间和输出内容。

最后,我们使用gevent.joinall()方法等待所有任务运行完毕。这个方法会阻塞当前线程,直到所有协程都执行完毕。

需要注意的是,gevent实现协程的方式与greenlet略有不同,它将协程封装在Greenlet对象中,并提供了更多的控制方法和工具函数。如果需要实现复杂的协程切换和并发处理,可以考虑使用gevent库。

转载自:https://juejin.cn/post/7218023140034641979
评论
请登录