gpt4 book ai didi

python - 将复杂字典放入返回队列时,多处理进程不加入

转载 作者:行者123 更新时间:2023-11-28 17:24:31 25 4
gpt4 key购买 nike

给定一个带有读取队列和写入队列的非常标准的读/写多线程进程:

打印了 8 次 worker done,但从未传递 join() 语句。但是,如果我将 queue_out.put(r) 替换为 `queue_out.put(1) 它会起作用。

这让我的大脑都快融化了,可能真的很愚蠢。我应该复制我的字典并将其放入返回队列吗?我在某个地方犯了一个愚蠢的错误吗?

过程函数

def reader(queue_in, queue_out, funktion):
# Read from the queue
while True:
r = queue_in.get()
if r == 'DONE':
return
funktion(r) # funktion adds additional keys to the dictionary
queue_out.put(r) # <---- replacing r by 1 does let me join()
print "worker done" # <----- this happens

填充输入队列

def writer(generator, queue):
# Write to the queue
for r in enumerate(generator):
# r is a complex dictionary
queue.put(r)
print "writer done"
for _ in range(0, WORKERS):
queue.put((-1, "DONE"))

其余

WORKERS = 8

# init Queues
queue_in = Queue()
queue_out = Queue()

# Start processes, with input and output quests
readers = []
for _ in range(0, WORKERS):
p = Process(target=reader, args=(queue_in, queue_out, funktion))
p.daemon = True
p.start()
readers.append(p)

writer(generator, queue_in)

for p in readers:
p.join()

print "joined" # <---- this never happens

queue_in.close()

while not queue_out.empty():
print queue_out.get()
queue_out.close()

最佳答案

认为我从两个来源拼凑了这个,因为我总是遇到同样的问题。我认为重要的是这是在 Windows 中。

注释来自 the documentation

Since Windows lacks os.fork() it has a few extra restrictions:

然后阅读答案here join() 用于 fork 处理。

我一直设法以与您类似的方式运行 multiprocessing 而不使用 join() 并且没有看到任何错误 - 我非常高兴有一个反例解释为什么需要它。事实上,删除它已经解决了您的问题。

this article更深入地了解操作系统之间多处理中子进程的差异。我确实认为 join() 的问题,特别是应该在文档中更明确。

关于python - 将复杂字典放入返回队列时,多处理进程不加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com