2012-08-31 80 views
1

我有一個腳本運行了很多併發線程(至少200)。每個線程都會進行一些相當複雜的評估,這可能會花費大量的時間。評估方法在C中實現,我無法更改它。我想限制每個線程的方法執行時間。請指教。如何限制python多線程環境中的函數執行時間?

+0

這個問題和你的[other one]有什麼不同?(http://stackoverflow.com/questions/12222349/is-there-a-canonical-way-of-terminating-a-thread-in-python)? –

+0

@DavidRobinson這是另一項任務。我不想終止線程。它必須後處理部分評估結果。 –

+1

我以爲你說過你不能修改評估。如果無法修改,它如何返回部分結果? –

回答

1

從我所瞭解的問題來看,使用多處理而不是多線程可能是一個很好的例子。多重處理將允許您使用系統上的所有可用資源 - 如果您不小心,可以使用一些資源。

線程實際上並不是並行運行,所以除非你正在做很多等待I/O或類似的事情,否則從一個單獨的進程調用它會更有意義。您可以使用Python multiprocessing library從Python腳本中調用它,也可以使用用C語言編寫的包裝器並使用某種形式的interprocess communication。第二個選項將避免啓動另一個Python實例來運行一些C代碼的開銷。

您可以調用time.sleep(或執行其他任務並檢查系統時鐘的已用時間),然後在期望的時間間隔後檢查結果,允許任何尚未完成的進程在使用時繼續運行的結果。或者,如果你不在意這一點,你可以發送一個信號來殺死這個過程。

+2

OP表示計算結果在C中。C擴展可以釋放GIL,因此所有CPU內核都可以在不進行多處理的情況下使用 – jfs

+0

此外,您可能不希望一次在系統上運行200個進程,尤其是在CPU密集型。最好是批量運行它們,否則會引入額外的開銷,因爲它們都爭用可用的CPU時間和內存。 – 2012-08-31 23:39:23

+0

@ J.F.Sebastion:這樣做更有意義。不過,你不想一次運行200個這樣的東西。 – 2012-08-31 23:52:16