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开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
python使用arp欺骗伪造网关的方法
Apr 24 Python
浅谈python可视化包Bokeh
Feb 07 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
Python调用服务接口的实例
Jan 03 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
Python Numpy之linspace用法说明
Apr 17 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设计模式之迭代器模式
2016/06/17 PHP
jquery获得option的值和对option进行操作
2013/12/13 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python利用ansible分发处理任务
2015/08/04 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python小程序实现刷票功能详解
2019/07/17 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
面料业务员岗位职责
2013/12/26 职场文书
活动总结格式范文
2014/04/26 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python