想实现多进程执行某项任务( 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 1
q = mp.Manager().Queue()。个人经验是当你用 apply.async 卡住没抛出异常的时候,把他改成 apply 阻塞型,看是报啥错。
|
2
nikan999 2021-03-26 14:58:42 +08:00 1
打印错误
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(),输出超级大数让我机器内存无法释放……
|