2017-09-07 140 views
0

我在寫一些可以很容易並行化的開放式cv代碼。但我遇到了一個問題。蟒蛇多線程的例子一般是這樣的:有沒有辦法在python中重新使用線程工作?

from multiprocessing.dummy import Pool 

def slow_function(input): 
    ** opencv transforms and things ** 
    return output 

worker_pool = Pool(4) 
result = worker_pool.map(slow_function,list_of_inputs) 
worker_pool.close() 
worker_pool.join() 

我已經得到這爲我的代碼工作,但我一直在計時它和線worker_pool = Pool(4)本身就需要100毫秒。其餘代碼運行速度非常快。

這產生了100ms的最小開銷,這使得不是特別有用。我的應用程序是實時的,所以即使我的代碼的其餘部分立即運行,我也會被限制在10fps。

看來我應該能夠避免每個週期創建和銷燬池,從而節省了這100ms。有沒有辦法做到這一點?理想情況下,我想打電話給map然後join,只是有工人「忘記」,他們甚至跑到什麼,一旦他們跑slow_funcion並返回

回答

1

對於您的問題最簡單的解決方案是根本不要撥打worker_pool.close()和/或worker_pool.join()。這將使您的線程保持活動狀態並可用於處理新數據。

worker_pool.map()將負責等待線程傳遞結果,並且會在您的代碼中爲您提供同步點。

儘管如此,您確實需要保持線程池處於活動狀態並可用。根據你的體系結構,這可能是也可能不是最好的包裝在一個對象(因此定義一個class)。

+0

非常好!這工作。執行時間從135ms(單線程)和110ms(多線程)變爲40ms(多線程,重用工人)。謝謝! – Drew

0

你可以只產卵過程中根據需要和使用隊列模塊傳遞之間的數據你的主要過程和「慢速功能」過程。

相關問題