当通过torch.multiprocessing.Queue()从多进程获取张量时,运行时错误:无法打开共享事件



当程序运行到queue.get((时,RuntimeError:无法打开共享事件:<0000023F7034DF52>,错误代码:<2>。然而,如果使用numpy而不是tensor,程序就可以工作。如何从多进程中获取torch.ttensor?

import torch
import torch.multiprocessing as mp
import numpy as np
def solve(queue):
for i in range(3):
queue.put(torch.ones((2, 2)))
# queue.put(np.ones((2, 2))) #it works
def func():
jobs = []
queue = mp.Queue()
for i in range(5):
p = mp.Process(target=solve, args=(queue,))
jobs.append(p)
p.start()
for j in jobs:
j.join()
print('end')
out = queue.get()
if __name__ == '__main__':
func()

Torch张量作为文件描述符通过套接字传递。当生产者进程在消费者从队列中读取张量之前完成时,就会发生错误。一种解决方案是在消费者过程结束时等待,直到从队列中读取张量,这在这里已经提出:https://discuss.pytorch.org/t/using-torch-tensor-over-multiprocessing-queue-process-fails/2847/2.

另一种解决方案是使用可加入队列,并使用queue.join()在生产者进程中等待,直到使用消费者成功获得所有张量;一旦消费者获得张量,就调用queue.task_done(),如下所述:https://discuss.pytorch.org/t/using-torch-tensor-over-multiprocessing-queue-process-fails/2847/10

最新更新