precess使用进程池队列管理问题
背景:
在进行视频取帧的过程中,为了加速,用process多进程同时去做,将取到的帧放到队列中,之后会同时有另外的进程同时进行处理。
但是在实际的操作中发现,直接将队列放到参数的位置,所放到进程池中的子线程是不会运行的。
于是上网查找了一些资料,发现要用Manager
来管理multiprocessing.Queue
,这样线程池中的子线程才会运行。
代码如下:
无法运行的代码:
def x(q):
print('hello,world')
q = multiprocess.Queue(3)
pool = multiprocess.Pool(3)
for i in range(10):
pool.apply_async(x, args=(q,))
pool.close()
pool.join()
上面的代码是不会运行的,最主要的原因就是进程中的参数队列在创建的时候没有用Manager
进行管理。
改成下面代码就会成功运行
def x(q):
print('hello,world')
m = multiprocess.Manager()
q = m.Queue(3)
pool = multiprocess.Pool(3)
for i in range(10):
pool.apply_async(x, args=(q,))
pool.close()
pool.join()
此外我还遇到两种进程池中的进程不执行
- 在
pool.apply_async(target, args)
中的args参数元祖中,只有一个参数,但是参数后面没有加逗号。 - 使用了进程中的event()函数