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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
wxPython中文教程入门实例
Jun 09 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
python从入门到精通(DAY 3)
Dec 20 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
python使用udp实现聊天器功能
Dec 10 Python
python实现祝福弹窗效果
Apr 07 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
为什么说Python可以实现所有的算法
Oct 04 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
Python3列表List入门知识附实例
Feb 09 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 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 expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
Node.js assert断言原理与用法分析
2019/01/04 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
司机辞职报告范文
2014/01/20 职场文书
社区中秋节活动方案
2014/01/29 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
校运会班级霸气口号
2015/12/24 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
MySQL创建管理子分区
2022/04/13 MySQL