【发布时间】:2020-05-03 11:23:42
【问题描述】:
我正在尝试解决 Python 中的多处理任务。
我可以在multiprocess 模块的帮助下完成他的任务,但不能通过multiprocessing 模块应用同样的任务。我必须申请多处理模块,因为我需要使用freeze_support()。
首先我认为问题出在我的代码和帖子this 上,但尚未收到任何答案。然后我想运行一个应用multiprocessing 模块的玩具示例,看看我是否能弄清楚为什么我的系统上不能运行多处理。所以我运行了我从this tutorial 获得的这段代码。
import multiprocessing
import time
def cpu_bound(number):
return sum(i * i for i in range(number))
def find_sums(numbers):
with multiprocessing.Pool() as pool:
pool.map(cpu_bound, numbers)
if __name__ == "__main__":
numbers = [5_000_000 + x for x in range(20)]
start_time = time.time()
find_sums(numbers)
duration = time.time() - start_time
print(f"Duration {duration} seconds")
multiprocessing 模块似乎无法在我的机器上运行,因为这个玩具示例也无法在我的系统上运行。
当我在这个玩具示例上应用 multiprocess 模块时,结果很快就显示出来了,因为我使用了我所有的内核。
所以我想知道问题出在我系统上的特定配置上,还是multiprocess 模块中的freeze_support() 等效?
通过说“这个模块不会在我的系统上运行”,我的意思是进程已经产生,但 cpu 不会上升,而且似乎什么都没有发生......大约 10 分钟后,我手动终止了跑。但是使用多进程模块,代码在 1 分钟内完成。
提前致谢。
PS:我的机器有 4 个核心。
【问题讨论】:
-
尝试将
numbers = ...下的所有内容放入if语句中 -
你需要把所有底部代码块放在
if __name__块中... -
您的代码在 Windows 上已损坏,因此可以合理地假设问题是由于您对链接教程中的复制粘贴使用不当造成的。结束你的问题是完全正确的。话虽这么说,因为您现在知道问题是其他问题(即使我留下了明确的评论,您也有一周没有提到)我会重新打开它,就这么简单。您应该删除问题或留下解释问题的自我答案。
-
您的代码在我使用 spyder 4.1、python 3.8、ubuntu 16.04 的机器上运行时间为 2.5 秒。
-
别担心,关闭不是结束,而是让问题得到解答的一种方式。在您确认不是
__name__块的那一刻,我本可以重新打开。不幸的是,spyder 有很多令人惊讶的怪癖,没有一个是更好的。
标签: python multiprocessing python-multiprocessing