2016-02-01 104 views
0

我一直有一些麻煩與Python的多處理模塊。我需要測試具有不同參數的函數,並且該函數執行大量計算,所以使用所有內核是最合適的。我最終使用了pool.map(),它適合我的需要。問題是,有時我的函數永遠不會結束,所以pool.map會永遠阻止永遠期待返回的值。我不知道爲什麼會發生這種情況。我在不使用多處理的情況下做了很多測試,只是在for循環中傳遞一個接一個的結論,並且總是結束。處理與Python多處理

不管怎樣,我想現在要做的是爲每個工人/執行功能的超時,但我需要在函數中的變量,以在達到超時的情況下返回。這就像超時發生之前函數的狀態。我的代碼是太大了,它張貼在這裏,但這裏有一個簡單的,下面這個例子:

def func(x): 
    secsPassed = 0 
    for _ in xrange(x): 
     time.sleep(1) 
     secsPassed +=1 

    return secsPassed 

pool = Pool(4) 
results = pool.map(func, [3, 10, 50, 20, 300]) 

所以我想,每個執行需要在最長30秒,我也想知道的價值secs在func被取消之前被刪除。我正在使用Python 2.7,並且可以對func進行更改,或者在必要時使用Pool.map以外的其他工具。

在此先感謝。

+0

也許改變芹菜?它允許超時,並容易重試。此外,如果您在服務器上安裝RabbitMQ,則可以通過部署連接到相同RabbitMQ的代碼來使用多臺服務器或PC。 – user1157751

+0

我會檢查出來,但我寧願避免使用第三方庫爲這個項目。 – Larvasapiens

回答

0

This question has been asked several times in the past.

multiprocessing.Pool還沒有被設計用於這種用途的情況。

強迫一個工人自殺會導致不確定的行爲可能從剩下的改變卡在那裏永遠讓你的程序崩潰。

有能夠解決您的問題庫。 pebble允許您爲工作人員設置超時時間,並在時間限制超時後停止工作。