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实现多线程抓取妹子图
Aug 08 Python
Python入门_条件控制(详解)
May 16 Python
Python 使用with上下文实现计时功能
Mar 09 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Atom的python插件和常用插件说明
Jul 08 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
利用Python检测URL状态
Jul 31 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
PyTorch实现AlexNet示例
Jan 14 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
python 带时区的日期格式化操作
Oct 23 Python
Python find()、rfind()方法及作用
Dec 24 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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
js 单引号 传递方法
2009/06/22 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
JS判定是否原生方法
2013/07/22 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
Python httplib模块使用实例
2015/04/11 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
利用Python实现kNN算法的代码
2019/08/16 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
西部世纪面试题
2014/12/05 面试题
Linux常见面试题
2016/10/04 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
三孔导游词
2015/02/05 职场文书
golang正则之命名分组方式
2021/04/25 Golang
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python