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批量下载图片的三种方法
Apr 22 Python
python list转dict示例分享
Jan 28 Python
python实现多线程采集的2个代码例子
Jul 07 Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
Python使用django获取用户IP地址的方法
May 11 Python
Python循环语句中else的用法总结
Sep 11 Python
Python函数参数操作详解
Aug 03 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
详解如何减少python内存的消耗
Aug 09 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Django 如何实现文件上传下载
Apr 08 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执行速度全攻略
2006/10/09 PHP
php与paypal整合方法
2010/11/28 PHP
Admin generator, filters and I18n
2011/10/06 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
关于js遍历表格的实例
2013/07/10 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
javascript 闭包详解
2015/02/15 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
vue.js响应式原理解析与实现
2020/06/22 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
wxpython 学习笔记 第一天
2009/03/16 Python
python中xrange和range的区别
2014/05/13 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
优质的学校老师推荐信
2013/10/28 职场文书
商铺租赁意向书
2014/04/01 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
维稳工作情况汇报
2014/10/27 职场文书
外贸英文求职信范文
2015/03/19 职场文书