zoukankan      html  css  js  c++  java
  • python gevent

    > 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):杀死一个协程
  • 相关阅读:
    linux & xp 双系统 重装的问题
    判断推理类试题的复言命题考点与题型总结
    Oracle、MySQL、SQL Server数据库的数据类型的差异
    java环境变量设置和问题及解决方法
    如何正确卸载MySQL,主要是删除注册表中的垃圾信息
    J2EE经典面试题及答案
    正则表达式
    囚犯的两难处境
    MySQL 数值数据类型
    linux学习之SHELL脚本
  • 原文地址:https://www.cnblogs.com/yuzhaoblog/p/12348082.html
Copyright © 2011-2022 走看看