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使用calendar输出指定年份全年日历的方法
Apr 04 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
Tensorflow累加的实现案例
Feb 05 Python
Python中包的用法及安装
Feb 11 Python
Django Admin后台添加数据库视图过程解析
Apr 01 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核心代码分析require和include的区别
2011/01/02 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
PHP实现的购物车类实例
2015/06/17 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python urllib爬虫模块使用解析
2019/09/05 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
python 5个顶级异步框架推荐
2020/09/09 Python
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
中科创达面试题
2016/12/28 面试题
《阳光》教学反思
2014/02/23 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS