python 协程 gevent原理与用法分析

作者:小飞侠v科比 时间:2021-10-12 23:36:19 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/kai46385076/article/details/100058854

标签:python,协程,gevent
0
投稿

猜你喜欢

  • Go语言题解LeetCode705设计哈希集合

    2024-03-19 22:30:38
  • 从列表或字典创建Pandas的DataFrame对象的方法

    2022-06-12 13:03:45
  • Python写的Socks5协议代理服务器

    2022-03-16 21:22:44
  • Redis持久化机制实现原理和流程

    2021-03-22 00:43:39
  • python 打印出所有的对象/模块的属性(实例代码)

    2023-09-02 21:46:15
  • W3C Group的JavaScript1.8新特性介绍

    2009-07-24 12:31:00
  • Oracle 忘记密码的找回方法

    2009-03-06 11:12:00
  • Python计算字符宽度的方法

    2021-02-13 20:25:28
  • 对python 多线程中的守护线程与join的用法详解

    2021-08-11 10:56:51
  • python pip安装的包目录(site-packages目录的位置)

    2022-08-23 13:20:38
  • php输出xml必须header的解决方法

    2023-09-11 20:00:16
  • python实现简易名片管理系统

    2022-12-23 13:14:53
  • python实现输入三角形边长自动作图求面积案例

    2023-08-12 01:47:49
  • 如何把一个Excel文件放到ASP页面中去?

    2009-11-07 17:54:00
  • 解决el-tree节点过滤不显示下级的问题

    2024-05-29 22:24:03
  • Python著名游戏实战之方块连接 我的世界

    2022-12-10 06:25:50
  • 简单说明Python中的装饰器的用法

    2022-01-30 21:57:32
  • JavaScript中实现字符串的取左取右(实现left和right功能)

    2009-07-20 12:39:00
  • JavaScript 中为 Date 类实现 DateAdd 方法

    2008-04-03 16:19:00
  • JavaScript实现前端倒计时效果

    2024-06-05 09:34:10
  • asp之家 网络编程 m.aspxhome.com