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实现Linux下守护进程的编写方法
Aug 22 Python
python机器学习之神经网络(三)
Dec 20 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
TensorFlow Session会话控制&amp;Variable变量详解
Jul 30 Python
python时间序列按频率生成日期的方法
May 14 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
解决python对齐错误的方法
Jul 16 Python
Python入门基础之数字字符串与列表
Feb 01 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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
一个查看session内容的函数
2006/10/09 PHP
php ios推送(代码)
2013/07/01 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
简述Angular 5 快速入门
2017/11/04 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
python中的多重继承实例讲解
2014/09/28 Python
python获取本地计算机名字的方法
2015/04/29 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Python之时间和日期使用小结
2019/02/14 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
委托公证书范本
2014/04/03 职场文书
春节联欢会策划方案
2014/05/16 职场文书
超越自我演讲稿
2014/05/21 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
保管员岗位职责
2015/02/14 职场文书
标枪加油稿
2015/07/22 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS