Python——eventlet.greenpool


  該模塊提供對 greenthread 池的支持。

  greenthread 池提供了一定數量的備用 greenthread ,有效限制了孵化 greenthread 過多導致的內存不足,當池子中沒有足夠的空閑 greenthread 時,孵化過程被暫停,只有當先前工作中的 greenthread 完成當前工作,才能為下一個任務做孵化准備。

   本模塊包括兩個類:

  1. eventlet.greenpool.GreenPool

  2. eventlet.greenpool.GreenPile

 

一、 class eventlet.greenpool.GreenPool(size=1000) 

  該類的對象是 green threads 的池子,默認容量是1000個green threads。

該類的方法

  1. free()

  2. imap(function, *iterables)

  3. resize(new_size)

  4. running()

  5. spawn(function, *args, **kwargs)

  6. spawn_n(function, *args, **kwargs)

  7. starmap(function, iterable)

  8. waitall()

  9. waiting()

1.

free() 

  返回當前對象中可用的greenthreads。

  如果為 0 或更少,那么 spawn() 和 spawn_n() 將會阻塞調用 greenthread 直到有新的可用的 greenthread 為止。

  至於為什么此處可能返回負值,請查看3. resize()

2.

imap(function, *iterables)  

  效果等同於 itertools.imap() ,在並發和內存使用上等同於 starmap() 。

  例如,可以非常方便地對文件做一些操作:

def worker(line):
    return do_something(line)
pool = GreenPool()
for result in pool.imap(worker, open("filename", 'r')):
    print(result)

3. 

resize(new_size) 

  改變當前允許同時工作的 greenthreads 最大數量

  如果當前有多於 new_size 的 greenthreads 處於工作中,它們可以完成自己的執行,只不過此時不許任何的新 greenthreads 被分配。只有當足夠數量的 greenthreads 完成自己的工作,然后工作中的 greenthreads 總數低於 new_size 時,新的 greenthreads 才能被分配。在此之前,free() 的返回值將會使負的。 

4.

running()

  返回當前池子中正在執行任務的 greenthreads 。

5.

spawn(function, *args, **kwargs) 
    
  從當前的池子中孵化一個可用的greenthread,在這個 greenthread 中執行  function ,參數 *args, **kwargs 為傳給  function 的參數。返回一個 GreenThread 對象,這個對象執行着 function ,可以通過該  GreenThread 對象獲取  function 的返回值。
  如果當前池子中沒有空余的 greenthread ,那么該方法阻塞直到有新的可用的 greenthreads 被釋放。
  該函數可以重用, function  可以調用同一個 GreenPool 對象的 spawn 方法,不用擔心死鎖。
    
6.
spawn_n(function, *args, **kwargs) 
  
  創建一個 greenthread 來運行  function,效果等同於  spawn()。 只不過這個函數返回 None,即丟棄  function 的返回值。 
 
7.
starmap(function, iterable)
  
  等同於  itertools.starmap()除了對於可迭代對象中的每一個元素,都會在一個 greenthread 里面執行  func 。 並發的上限由池子的容量限制。在實際的操作中, starmap() 消耗的內存與池子的容量成比例,從而格外適合遍歷特別長的輸入列表。 
  
8.
waitall()
  
  等待池子中的所有 greenthreads 完成工作。
  
9.
waiting()
  
  返回當前等待孵化的 greenthreads 數。
  
二、
class eventlet.greenpool.GreenPile(size_or_pool=1000)  
  
  GreenPile 是一些I/O相關任務的抽象。
  可以使用一個已經存在的 GreenPool 對象構造一個 GreenPile ,這個 GreenPile 在處理自己的任務時將會用那個池子的並發。一個 GreenPool 可以對應多個 GreenPile。
  一個 GreenPile 也可以獨立構造,不與任何 GreenPool 綁定。只需要在創建實例時傳入一個整數作為參數即可。
  使用不是當前調用 spawn() 的 greenthread 迭代一個 GreenPile 並不明智,迭代器將會過早的退出。 
  
該類的方法有
1.   next() 

等待下一個結果,掛起當前的 greenthread 直到結果可用為止。 當沒有更多的結果時,拋出 StopIteration 異常。

2.   spawn(func, *args, **kw) 

在它自己的 greenthread 中運行 func,結果儲存在 GreenPile 對象中,可以迭代該對象獲取這些結果。


免責聲明!

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



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