我正在编写一些可以轻松并行化的开放式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。
似乎我应该能够避免在每个周期创建和销毁池,从而节省那些100毫秒。有没有办法做到这一点?理想情况下,我想拨打map
然后join
,让工作人员“忘记”他们甚至在运行slow_funcion
后运行任何内容并返回
答案 0 :(得分:1)
解决您问题的最简单方法是不要拨打worker_pool.close()
和/或worker_pool.join()
。这将使您的线程保持活动并可用于处理新数据。
worker_pool.map()
将负责等待线程提供结果,并在代码中为您提供同步点。
但是,您确实需要保持线程池的活动和可用性。根据您的体系结构,通过将其包装在对象中(因此定义class
)可能会或可能不是最好的。
答案 1 :(得分:0)
您可以根据需要生成进程,并使用Queue模块在主进程和“slow_function”进程之间传递数据。