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):殺死一個協程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM