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制作检测Linux运行信息的工具的教程
Apr 01 Python
Python字符串中查找子串小技巧
Apr 10 Python
Python numpy 常用函数总结
Dec 07 Python
Python查看微信撤回消息代码
Jun 07 Python
浅析python中的迭代与迭代对象
Oct 08 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
python生成器与迭代器详解
Jan 01 Python
Python queue队列原理与应用案例分析
Sep 27 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
一个简单的PHP投票程序源码
2007/03/11 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python装饰器用法实例分析
2019/01/14 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
Java如何格式化日期
2012/08/07 面试题
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
英文感谢信格式
2015/01/21 职场文书
个人借条范本
2015/05/25 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技