ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python gevent

2020-02-22 23:56:28  阅读:280  来源: 互联网

标签:协程 python job gevent greenlet Greenlet pool


> gevent介绍

  gevent是第三方库,通过 greenlet 实现 coroutine,创建、调度的开销比 线程(thread) 还小,因此程序内部的执行流效率高。

  其基本思想是:当一个greenlet遇到IO操作时 (比如访问网络)就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

  由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

 

> gevent常用方法:
  gevent.spawn()                             创建一个普通的Greenlet对象并切换 
  gevent.spawn_later(seconds=3)      延时创建一个普通的Greenlet对象并切换
  gevent.spawn_raw()                      创建的协程对象属于一个组
  gevent.getcurrent()                       返回当前正在执行的greenlet
  gevent.joinall(jobs)                        将协程任务添加到事件循环,接收一个任务列表
  gevent.wait()                                可以替代join函数等待循环结束,也可以传入协程对象列表
  gevent.kill()                                  杀死一个协程
  gevent.killall()                               杀死一个协程列表里的所有协程
  monkey.patch_all()                        非常重要,会自动将python的一些标准模块替换成gevent框架

 

> gevent常见用法

# Greenlet对象
from gevent import Greenlet

# Greenlet对象创建
job = Greenlet(target0, 3)
Greenlet.spawn() # 创建一个协程并启动
Greenlet.spawn_later(seconds=3) # 延时启动

# 协程启动
job.start() # 将协程加入循环并启动协程
job.start_later(3) # 延时启动

# 等待任务完成
job.join() # 等待任务完成
job.get() # 获取协程返回的值

# 任务中断和判断任务状态
job.dead() # 判断协程是否死亡
job.kill() # 杀死正在运行的协程并唤醒其他的协程,这个协程将不会再执行,可以
job.ready() # 任务完成返回一个真值
job.successful() # 任务成功完成返回真值,否则抛出错误

# 获取属性
job.loop # 时间循环对象
job.value # 获取返回的值

# 捕捉异常
job.exception # 如果运行有错误,获取它
job.exc_info # 错误的详细信息

# 设置回调函数
job.rawlink(back) # 普通回调,将job对象作为回调函数的参数
job.unlink() # 删除回调函数
# 执行成功的回调函数
job.link_value(back)
# 执行失败的回调函数
job.link_exception(back)

gevent.Pool的特殊方法:
pool.wait_available():等待直到有一个协程有结果
pool.dd(greenlet):向进程池添加一个方法并跟踪,非阻塞
pool.discard(greenlet):停止跟踪某个协程
pool.start(greenlet):加入并启动协程
pool.join():阻塞等待结束
pool.kill():杀死所有跟踪的协程
pool.killone(greenlet):杀死一个协程

 

标签:协程,python,job,gevent,greenlet,Greenlet,pool
来源: https://www.cnblogs.com/yuzhaoblog/p/12348082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有