【发布时间】:2019-02-05 22:32:49
【问题描述】:
我在 python 多处理方面遇到问题
python 版本 3.6.6
在 Windows 7 上使用 Spyder IDE
1.
队列没有被填充 -> 每次我尝试阅读它时,它都是空的。在某处我读到,我必须在处理 join() 之前 get() 它,但它没有解决它。
from multiprocessing import Process,Queue
# define a example function
def fnc(i, output):
output.put(i)
if __name__ == '__main__':
# Define an output queue
output = Queue()
# Setup a list of processes that we want to run
processes = [Process(target=fnc, args=(i, output)) for i in range(4)]
print('created')
# Run processes
for p in processes:
p.start()
print('started')
# Exit the completed processes
for p in processes:
p.join()
print(output.empty())
print('finished')
>>>created
>>>started
>>>True
>>>finished
我希望输出不为空。
如果我将它从 .join() 更改为
for p in processes:
print(output.get())
#p.join()
它冻结了
2.
我遇到的下一个问题是 pool.map() - 它冻结并且没有机会超过内存限制。我什至不知道如何调试这么简单的一段代码。
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4)
print('Pool created')
# print "[0, 1, 4,..., 81]"
print(pool.map(f, range(10))) # it freezes here
希望在一个主题中有两个问题不是什么大问题
【问题讨论】:
-
除了使用
queue.empty()检查(不可靠)您的代码看起来不错。 Spyder 至少因多处理问题而出名。尝试从终端运行您的代码。
标签: python process queue multiprocessing pool