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线程池的实现实例
Nov 18 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
pandas多级分组实现排序的方法
Apr 20 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
python使用turtle库绘制时钟
Mar 25 Python
Python错误处理操作示例
Jul 18 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python csv模块使用方法代码实例
Aug 29 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
python高阶函数map()和reduce()实例解析
Mar 16 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
PHP4中session登录页面的应用
2008/07/25 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
javascript radio 联动效果
2009/03/04 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
移动节点的jquery代码
2014/01/13 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Django发送html邮件的方法
2015/05/26 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
《小猫刮胡子》教学反思
2014/02/21 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
python小程序之飘落的银杏
2021/04/17 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA