Python协程包gevent

382 阅读1分钟

在项目中常常需要执行一个耗时的任务,使用并行处理会大大节省时间,但Python自带的协程库asyncio使用场景非常有限,网上大多是介绍asyncio.sleep()来模拟异步任务,但是我们写代码的时候是不会使用这个的,对于真正的耗时的任务,鄙人按照网上的文章尝试了很多种方式,都以失败告终,因为asyncio是无法识别一般的阻塞任务的,直到知道了gevent这个支持协程的包。

使用方式

pip install gevent

代码示例

import time

import gevent
from gevent import monkey; monkey.patch_all()

def test(str):
    time.sleep(1)
    return str

if __name__ == '__main__':
    g1 = gevent.spawn(test, "a")
    g2 = gevent.spawn(test, "b")
    g3 = gevent.spawn(test, "c")
    gevent.joinall([g1, g2, g3])
    print(g1.value)
    print(g2.value)
    print(g3.value)

模拟了一个耗时的异步任务,可以看到,a,b,c是同时打印的,也就是说不会出现等待, 可以使用这种方式执行并行的任务。

from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前 或者我们干脆记忆成:要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头