2012-02-23 82 views
2

我正在嘗試執行以下操作。Python和線程 - 線程如果運行多個進程慢慢死去

  1. 我有8個內核。

  2. 我執行8個過程如下,其中core_aa是文件名加載URL轉換成一個隊列

    python threaded_crawl.py core_aa --max_async_count=20 --use_headers --verbose > /tmp/core_aa.out 
    python threaded_crawl.py core_ab --max_async_count=20 --use_headers --verbose > /tmp/core_ab.out 
    python threaded_crawl.py core_ac --max_async_count=20 --use_headers --verbose > /tmp/core_ac.out 
    python threaded_crawl.py core_ad --max_async_count=20 --use_headers --verbose > /tmp/core_ad.out 
    python threaded_crawl.py core_ae --max_async_count=20 --use_headers --verbose > /tmp/core_ae.out 
    python threaded_crawl.py core_af --max_async_count=20 --use_headers --verbose > /tmp/core_af.out 
    python threaded_crawl.py core_ag --max_async_count=20 --use_headers --verbose > /tmp/core_ag.out 
    python threaded_crawl.py core_ah --max_async_count=20 --use_headers --verbose > /tmp/core_ah.out 
    
  3. 如果每個proccess是運行20個線程,其任務是取一個URL的螺紋應用程序。如果我有例如60K URL和我運行一個proccess的工作與生活,直到隊列中的所有線程完成是空

  4. 如果我運行一個以上的過程中,我注意到,線程開始慢慢例如死每1000思想OS一個死亡爲一個proccess分裂60K至8線程的總numm​​ber爲20 * 8

  5. 每個處理共享的任何數據。

因此,假設一個作業是一個作品,爲什麼要執行多個進程kill線程?

我該如何解決?

class ThreadClass(threading.Thread): 
def __init__(self,parms={},proxy_list=[],user_agent_list=[],use_cookies=True,fn=None,verbose=False): 
     threading.Thread.__init__(self) 
def run(self): 
    while page_queue.qsize()>0: 
     FETCH URLS.... 


for page in xrange(THREAD_LIMIT): 
     tc = ThreadClass(parms=parms,proxy_list=proxy_list,user_agent_list=user_agent_list,use_cookies=use_cookies,fn=fn,verbose=verbose) 
     tc.start() 
     while threading.activeCount()>=THREAD_LIMIT: 
      time.sleep(1) 
     while threading.activeCount()>1: 
       time.sleep(1) 

我已經知道如何調試,並沒有錯誤。既然我有以下情況,

while threading.activeCount()>1: 
       time.sleep(1) 

一旦線程都死了,代碼繼續即使有在排隊時留下的線程應該運行,直到隊列爲空項。

很混亂。

一旦活性計數

+0

PS..for每個線程我使用開罐器= urllib2.build_opener()。有關於文件描述符c.f的喋喋不休http://stackoverflow.com/questions/9308166/in-python-when-threads-die。這可能是原因嗎?我不打開文件,但我使用urllib2來獲取網頁。 – Tampa 2012-02-23 20:15:02

+0

我正在使用opener。關閉() – Tampa 2012-02-23 20:27:26

+0

PPS當我添加folling代碼來啓動一個新線程,如果最大線程數低於threashold它的工作 - > threading.activeCount()> 1: 如果threading.activeCount() THREAD_LIMIT: NTC = THREAD_LIMIT - threading.activeCount() 爲i的x範圍(NTC): TC = ThreadClass(PARMS = PARMS,proxy_list = proxy_list,user_agent_list = user_agent_list,use_cookies = use_cookies,FN = FN,詳細=詳細) tc.start() print「開始一個新的線程」 time.sleep(1) – Tampa 2012-02-23 21:40:52

回答

3

.qsize()返回近似大小。請勿使用page_queue.qsize() > 0來檢查隊列是否爲空。你可以使用while True: .. page_queue.get() ..和定點知道你什麼時候完成,examplequeue.task_done()queue.join()組合。

.run()方法捕獲例外,以避免過早地殺死一個線程。

請勿使用.activeCount()如果您需要n線程,則只需創建n線程。

讓你的線程後臺。能夠在任何時候中斷程序。

如果你的程序IO束縛你不需要多個進程。否則,您可以使用multiprocessing模塊來管理多個進程,而不是手動啓動它們。

+0

哇....謝謝...解決了很多問題。 – Tampa 2012-02-26 03:12:56