2017-09-07 90 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

你可以只产卵过程中根据需要和使用队列模块传递之间的数据你的主要过程和“慢速功能”过程。

相关问题