繼從我在評論問題this answer的問題"Gevent pool with nested web requests":gevent:產生大量greenlet的缺點?
假設一個具有大量的任務,沒有任何缺點使用gevent.spawn(...)同時產卵所有的人而不是使用gevent池和pool.spawn(...)來限制併發greenlet的數量?
表述方式不同:使用gevent.Pool「限制併發性」有沒有什麼好處,即使問題不需要解決?
任何想法會構成這個問題的「大數」?
繼從我在評論問題this answer的問題"Gevent pool with nested web requests":gevent:產生大量greenlet的缺點?
假設一個具有大量的任務,沒有任何缺點使用gevent.spawn(...)同時產卵所有的人而不是使用gevent池和pool.spawn(...)來限制併發greenlet的數量?
表述方式不同:使用gevent.Pool「限制併發性」有沒有什麼好處,即使問題不需要解決?
任何想法會構成這個問題的「大數」?
這只是一個更清潔,很好的做法,當處理很多東西。幾個星期前,我遇到了這個問題,我使用gevent spawn來驗證一堆針對30k的DNS郵件。
from gevent.pool import Pool
import logging
rows = [ ... a large list of stuff ...]
CONCURRENCY = 200 # run 200 greenlets at once or whatever you want
pool = Pool(CONCURRENCY)
count = 0
def do_work_function(param1,param2):
print param1 + param2
for row in rows:
count += 1 # for logging purposes to track progress
logging.info(count)
pool.spawn(do_work_function,param1,param2) # blocks here when pool size == CONCURRENCY
pool.join() #blocks here until the last 200 are complete
我在我的測試發現,當併發大約是200時,我的機器負荷將徘徊在EC2的m1.small約1。我做了一些天真的事情,如果再做一次,我會運行多個池並在它們之間休息一段時間,以便更均勻地分配NIC和CPU上的負載。
要記住的最後一件事是關注打開的文件,並在需要的時候增加該文件:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files。我正在運行的greenlets每個greenlet佔用大約5個文件描述符,所以如果你不小心,你可以很快用完。如果您的系統負載高於1,這可能沒有幫助,因爲無論如何,您都會看到收益遞減。
來自谷歌這裏,並決定運行一些快速測試,以產卵增加N
greenlet。共享成果,因爲他們可能是有用的同胞搜索:
# 1 greenlet
real 0m1.032s
user 0m0.017s
sys 0m0.009s
# 100 greenlets
real 0m1.037s
user 0m0.021s
sys 0m0.010s
# 1,000 greenlets
real 0m1.045s
user 0m0.035s
sys 0m0.013s
# 10,000 greenlets
real 0m1.232s
user 0m0.265s
sys 0m0.059s
# 100,000 greenlets
real 0m3.992s
user 0m3.201s
sys 0m0.444s
所以到1000 greenlets和性能損失很小,但一旦你開始打10000個greenlets,一切都慢下來。
測試代碼:
import gevent
N = 0
def test():
gevent.sleep(1)
while N < 1000:
N += 1
gevent.spawn(test)
gevent.wait()
當不使用池產卵大量greenlets的,我的程序保持兩個錯誤之間交替:gevent.hub.LoopExit':(「此操作將永遠堵」,'和'Gevent'我發現一個最佳池大小通過試驗和錯誤後,一切都解決了。作爲限制併發性的一個優點,並且我測量了用'pool.spawn()'而不是'gevent.spawn()'所花費的總時間。 –
Spade