2024年最全专题15 python中的协程库—greenlet和gevent

本文深入探讨了Python中的协程库greenlet和gevent,讲解了greenlet的生命周期、调度流程和使用建议,以及gevent如何解决线程性能问题,实现高效的并发。同时提到了gevent的自动任务切换和monkey patch技术,强调了确保协程正常结束的重要性。
摘要由CSDN通过智能技术生成
  • run:当 greenlet 启动的时候会调用到这个callable,如果我们需要继承greenlet.greenlet时,需要重写该方法
  • switch:前面已经介绍过了,在greenlet之间切换
  • parent:可读写属性,后面介绍
  • dead:如果greenlet执行结束,那么该属性为true
  • throw:切换到指定greenlet后立即跑出异常
import greenlet
 
 
def test1(x, y):
    z = gr2.switch(x+y)
    print('test1 ', z)
 
 
def test2(u):
    print('test2 ', u)
    gr1.switch(10)
 
 
gr1 = greenlet.greenlet(test1)
gr2 = greenlet.greenlet(test2)
print(gr1.switch("hello", " world"))

switch not all

import greenlet
 
 
def test1(x, y):
    z = gr2.switch(x+y)
    print('test1 ', z)
 
 
def test2(u):
    print('test2 ', u)
    gr1.switch(10)
 
 
gr1 = greenlet.greenlet(test1)
gr2 = greenlet.greenlet(test2)
print(gr1.switch("hello", " world"))
# 'test2 ' 'hello world'
# 'test1 ' 10
# None

每一个 Greenlet 都有一个 parent,一个新的 greenlet 在哪里创生,当前环境的 greenlet 就是这个新 greenlet 的 parent。所有的greenlet 构成一棵树,其跟节点就是还没有手动创建 greenlet 时候的 ”main” greenlet(事实上,在首次 import greenlet 的时候实例化)。当一个协程 正常结束,执行流程回到其对应的parent;或者在一个协程中抛出未被捕获的异常,该异常也是传递到其parent。

greenlet 生命周期

from greenlet import greenlet
 
 
def test1():
    gr2.switch(1)
    print('test1 finished')
 
 
def test2(x):
    print('test2 first', x)
    z = gr1.switch()
    print('test2 back', z)
 
 
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
print('gr1 is dead?: %s, gr2 is dead?: %s' % (gr1.dead, gr2.dead))
gr2.switch()
print('gr1 is dead?: %s, gr2 is dead?: %s' % (g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值