該子產品提供對 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 對象中,可以疊代該對象擷取這些結果。