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实现列表转换成字典数据结构的方法
Mar 11 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
简单实现Python爬取网络图片
Apr 01 Python
python format 格式化输出方法
Jul 16 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
python多任务及返回值的处理方法
Jan 22 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
python中的None与NULL用法说明
May 25 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
珊瑚虫IP库浅析
2007/02/15 PHP
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
PHP xpath()函数讲解
2019/02/11 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
深入了解Python在HDA中的应用
2019/09/05 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
交通安全演讲稿
2014/01/07 职场文书
网上书店创业计划书
2014/01/12 职场文书
项目经理任命书内容
2014/06/06 职场文书
荆州古城导游词
2015/02/06 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python