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使用urllib2获取网络资源实例讲解
Dec 02 Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 Python
在Python中使用元类的教程
Apr 28 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
PyQt5每天必学之事件与信号
Apr 20 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
Python玩转PDF的各种骚操作
May 06 Python
python实现证件照换底功能
Aug 20 Python
分享PyCharm的几个使用技巧
Nov 10 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 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正则走开
2008/03/15 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
详解Python用三种方式统计词频的方法
2019/07/29 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
解决python 上传图片限制格式问题
2019/10/30 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
python爬虫请求头的使用
2020/12/01 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
技术总监的工作职责
2013/11/13 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
法律进社区活动总结
2015/05/07 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript