2012-08-15 17 views
0

這裏是有問題的代碼(很簡單的履帶),該文件是一個網址列表,通常是一些> 1000如何確定異步阻止應用程序中的理想池大小?

import sys, gevent 
from gevent import monkey 
from gevent.pool import Pool 
import httplib, socket 
from urlparse import urlparse 
from time import time 

pool = Pool(100) 

monkey.patch_all(thread=False) 

count = 0 
size = 0 
failures = 0 

global_timeout = 5 
socket.setdefaulttimeout(global_timeout) 

def process(ourl, mode = 'GET'): 
    global size, failures, global_timeout, count 
    try: 
     url = urlparse(ourl) 
     start = time() 
     conn = httplib.HTTPConnection(url.netloc, timeout = global_timeout) 
     conn.request(mode, ourl) 
     res = conn.getresponse() 
     req = res.read() 
     end = time() 
     bytes = len(req) 
     took = end - start 
     print mode, ourl, bytes, took 
     size = size + len(req) 
     count += 1 
    except Exception, e: 
     failures += 1 

start = time() 

gevent.core.dns_init() 
print "spawning..." 
for url in open('domains'): 
    pool.spawn(process, url.rstrip()) 
print "done...joining..." 
pool.join() 
print "complete" 

end = time() 
took = end - start 
rate = size/took 
print "It took %.2f seconds to process %d urls." % (took, count) 
print rate, " bytes/sec" 
print rate/1024, " KB/sec" 
print rate/1048576, " MB/sec" 

print "--- summary ---" 
print "total:", count, "failures:", failures 

我得到這麼多,當我改變池的大小不同速度的變化: -

pool = Pool(100) 

我一直在思索寫一個算法來實時計算的理想池大小的想法,但不是在我跳想知道,如果有件事我一直忽略了?

回答

4

任何並行處理將是CPU限制或IO限制。從你的代碼的性質來看,它看起來就像在更小的池中,它將被IO綁定。具體來說,它將受到您的界面帶寬的約束,並且可能受到系統可以支持的同時打開的套接字的數量的限制(思考某些版本的Windows,這裏我已經在多個場合中使用了可用的套接字)。有可能當你增加池大小時,這個過程可能開始傾向於CPU限制(特別是,如果你有更多的數據處理沒有在這裏顯示)。爲了將池大小保持在最佳值,您需要監視所有這些變量的使用情況(開放套接字的數量,您的進程的帶寬利用率,CPU利用率等)。您可以通過在運行爬網程序時對指標進行分析並對池大小進行必要調整來手動執行此操作,也可以嘗試自動執行此操作。在Python中是否有可能這樣做是另一回事。

相關問題