python 协程 gevent原理与用法分析


Posted in Python onNovember 22, 2019

本文实例讲述了python 协程 gevent原理与用法。分享给大家供大家参考,具体如下:

gevent

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

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

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

安装

pip3 install gevent

1. gevent的使用

import gevent
def f(n):
  for i in range(n):
    print(gevent.getcurrent(), i)
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()

运行结果

<Greenlet at 0x10e49f550: f(5)> 0
<Greenlet at 0x10e49f550: f(5)> 1
<Greenlet at 0x10e49f550: f(5)> 2
<Greenlet at 0x10e49f550: f(5)> 3
<Greenlet at 0x10e49f550: f(5)> 4
<Greenlet at 0x10e49f910: f(5)> 0
<Greenlet at 0x10e49f910: f(5)> 1
<Greenlet at 0x10e49f910: f(5)> 2
<Greenlet at 0x10e49f910: f(5)> 3
<Greenlet at 0x10e49f910: f(5)> 4
<Greenlet at 0x10e49f4b0: f(5)> 0
<Greenlet at 0x10e49f4b0: f(5)> 1
<Greenlet at 0x10e49f4b0: f(5)> 2
<Greenlet at 0x10e49f4b0: f(5)> 3
<Greenlet at 0x10e49f4b0: f(5)> 4

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

2. gevent切换执行

import gevent
def 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()

运行结果

<Greenlet at 0x7fa70ffa1c30: f(5)> 0
<Greenlet at 0x7fa70ffa1870: f(5)> 0
<Greenlet at 0x7fa70ffa1eb0: f(5)> 0
<Greenlet at 0x7fa70ffa1c30: f(5)> 1
<Greenlet at 0x7fa70ffa1870: f(5)> 1
<Greenlet at 0x7fa70ffa1eb0: f(5)> 1
<Greenlet at 0x7fa70ffa1c30: f(5)> 2
<Greenlet at 0x7fa70ffa1870: f(5)> 2
<Greenlet at 0x7fa70ffa1eb0: f(5)> 2
<Greenlet at 0x7fa70ffa1c30: f(5)> 3
<Greenlet at 0x7fa70ffa1870: f(5)> 3
<Greenlet at 0x7fa70ffa1eb0: f(5)> 3
<Greenlet at 0x7fa70ffa1c30: f(5)> 4
<Greenlet at 0x7fa70ffa1870: f(5)> 4
<Greenlet at 0x7fa70ffa1eb0: f(5)> 4

3. 给程序打补丁

from gevent import monkey
import gevent
import random
import time
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")
])

运行结果

work1 0
work1 1
work1 2
work1 3
work1 4
work1 5
work1 6
work1 7
work1 8
work1 9
work2 0
work2 1
work2 2
work2 3
work2 4
work2 5
work2 6
work2 7
work2 8
work2 9

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python创建xml文件示例
Mar 22 Python
详解python字节码
Feb 07 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
python如何修改装饰器中参数
Mar 20 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
python 并发下载器实现方法示例
Nov 22 #Python
使用python绘制二维图形示例
Nov 22 #Python
python将邻接矩阵输出成图的实现
Nov 21 #Python
python实现小世界网络生成
Nov 21 #Python
使用Python的networkx绘制精美网络图教程
Nov 21 #Python
利用Python绘制Jazz网络图的例子
Nov 21 #Python
Python TCP通信客户端服务端代码实例
Nov 21 #Python
You might like
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP Session机制简介及用法
2014/08/19 PHP
PHP中文乱码解决方案
2015/03/05 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
基于php实现的验证码小程序
2016/12/13 PHP
犀利的js 函数集合
2009/06/11 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
微信小程序日历效果
2018/12/29 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python提取频域特征知识点浅析
2019/03/04 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
2014两会学习心得:时代的发展
2014/03/17 职场文书
平安建设实施方案
2014/03/19 职场文书
学生打架检讨书
2014/10/20 职场文书
信访稳定工作汇报
2014/10/27 职场文书
物流业务员岗位职责
2015/04/03 职场文书
初中毕业生感言
2015/07/31 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
世界文化遗产导游词
2019/08/07 职场文书
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技