首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一起学Python:gevent

gevent

greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块

其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

安装

1. gevent的使用

运行结果

可以看到,3个greenlet是依次运行而不是交替运行

2. gevent切换执行

import geventdef f(n):

for i in range(n):

print(gevent.getcurrent(), i)

#用来模拟一个耗时操作,注意不是time模块中的sleep

gevent.sleep(1)

g1 = gevent.spawn(f, 5)

g2 = gevent.spawn(f, 5)

g3 = gevent.spawn(f, 5)

g1.join()

g2.join()

g3.join()

运行结果

3. 给程序打补丁

from gevent import monkeyimport gevent

import randomimport timedef coroutine_work(coroutine_name):

for i in range(10):

print(coroutine_name, i)

time.sleep(random.random())

gevent.joinall([

gevent.spawn(coroutine_work, "work1"),

gevent.spawn(coroutine_work, "work2")

])

运行结果

from gevent import monkeyimport gevent

import randomimport time# 有耗时操作时需要monkey.patch_all()

# 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块

def coroutine_work(coroutine_name):

for i in range(10):

print(coroutine_name, i)

time.sleep(random.random())

gevent.joinall([

gevent.spawn(coroutine_work, "work1"),

gevent.spawn(coroutine_work, "work2")

])

运行结果

做最专业最懂你的python开发者交流平台,提供你最需要的开发学习资源。 我们专注于python开发技术的学习与交流,我们坚持,每天进步一小步,人生进步一大步!关注【Python开发者交流平台】,与我们一起学习进步。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171222G0YIL500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券