想实现多进程执行某项任务( moviepy 多进程),获得返回的值( frame,numpy 数组)。 尝试过用 ApplyResult.get() 获取,不过返回的内容不能被 pickle,所以用了 queue 。 或者还有其他更好的方法么
下面是个简单的 demo,似乎遇到了死锁,网上没有找到好的方案,求教
import multiprocessing as mp from multiprocessing import Pool,Queue import os,time,random def worker(msg,q): t_start = time.time() print("%s Started with pid: %d"%(msg,os.getpid())) a = 2**100000000 t_stop = time.time() print(msg," Finishing with time: %0.2f"%(t_stop-t_start)) q.put(a) if __name__ == '__main__': mp.set_start_method("spawn") pool = mp.Pool(3) q=mp.Queue() for i in range(10): print(i) pool.apply_async(worker,(i,q,)) pool.close() for thread_i in range(10): result = q.get() print(result) pool.join() print("Waiting")
1 xiaolinjia 2021-03-26 14:57:07 +08:00 ![]() q = mp.Manager().Queue()。个人经验是当你用 apply.async 卡住没抛出异常的时候,把他改成 apply 阻塞型,看是报啥错。 |
2 nikan999 2021-03-26 14:58:42 +08:00 ![]() 打印错误 Queue objects should only be shared between processes through inheritance 参考: https://stackoverflow.com/questions/9908781/sharing-a-result-queue-among-several-processes |
![]() | 3 Jblue 2021-03-26 14:59:47 +08:00 可以把返回值存起来放到 redis 之类的 |
4 mrning OP @xiaolinjia @nikan999 改了下,在 linux 下执行,能看到 print 的信息了。worker 函数执行完了,然后在 result = q.get()这里卡住了 @Jblue 实在不行的话...也是个办法 |
5 mrning OP |
6 nikan999 2021-03-26 15:25:58 +08:00 print 2**100000000 这个数太大了导致卡在打印这一块 |
![]() | 8 hareandlion 2021-03-26 16:00:04 +08:00 via Android queue 用 mp.Manager().Queue(),输出超级大数让我机器内存无法释放…… |