gpt4 book ai didi

Python 多处理 - 为什么我的进程没有返回/完成?

转载 作者:太空狗 更新时间:2023-10-30 02:55:23 26 4
gpt4 key购买 nike

我正在尝试并行化我的一项长时间运行的任务。由于某种原因,它不会完成并永远挂起。

import multiprocessing as mp

class PartitionedResult(object):
index = 0
P = []
def __init__(self, index, P):
self.index = index
self.P = P


def longRunningTask(index, output):
P = []
for i in range (0, 1000):
print(i)
P.append(i)

print("I'm done!")
output.put(PartitionedResult(index, P))
return

def main():
output = mp.Queue()
processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)]
for p in processes:
p.start()

for p in processes:
p.join()

results = [output.get() for p in processes]
print("This never shows up")



if __name__ == '__main__':
main()

它为 4 个进程中的每一个打印数字 0-999,甚至达到“我完成了!”行,但它不会到达 results = [output.get() for p in processes]

如果我将 for 循环的范围缩小到比方说 range(0,50),它就会突然起作用。

这里有什么问题?

编辑:我在 Windows 10 上使用 Python 3.4,我在 2 台不同的计算机上尝试过它并删除了 pycache。

最佳答案

get() 结果之前,您正在对所有进程调用 join()。当队列的缓冲区填满时,它可以在数据刷新到底层管道时阻塞。如果您 join() 一个进程以这种方式从您的消费者进程中阻塞,您就会陷入死锁,因为该进程只能在所有数据写入后退出。

将对 join 的调用移动到 main() 的末尾,然后它应该可以工作:

def main():
output = mp.Queue()
processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)]

for p in processes:
p.start()

results = [output.get() for p in processes]
print("This never shows up")

for p in processes:
p.join()

关于Python 多处理 - 为什么我的进程没有返回/完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614256/

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