【问题标题】:Why is my code not spawning two processes?为什么我的代码没有产生两个进程?
【发布时间】:2019-09-06 16:44:37
【问题描述】:

我的代码没有产生 2 个进程,我不知道为什么。我正在使用多处理 python 库中的 Process。

import os
from multiprocessing import Process

def dummy():
    while True:
        print(os.getpid())

p1 = Process(target=dummy())
p2 = Process(target=dummy())
p1.start()
p2.start()
p1.join()
p2.join()

预期结果:创建了 2 个进程 - 在 Windows 7 任务管理器中可见,并且我的代码打印了 2 个不同的进程 ID

实际结果: 只运行一个python进程,只打印一个进程id。

3480
3480
3480

【问题讨论】:

  • while 循环被阻塞

标签: python python-3.x python-multiprocessing


【解决方案1】:

您的代码并没有按照您认为正在做的事情。在这些行的第一行:

p1 = Process(target=dummy())

您正在调用dummy() 函数。如果你添加一些打印语句,你会发现你永远不会超出这条线。因为调用dummy()会在main进程中启动一个无限循环,而循环只会永远打印主进程的pid。

改为这样做:

p1 = Process(target=dummy)
p2 = Process(target=dummy)

也就是说,不要调用dummy,只传递函数对象。然后是后者

p1.start()

(etc) 将在一个新进程中调用 dummy(),这正是您的意图。

【讨论】:

  • 是否需要始终使用if __name__ == '__main__': 进行多处理?如果没有其中的代码,我会收到运行时错误:RuntimeErrorRuntimeError: : An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module:
  • 如果您在 Windows 上运行,您还需要将 mp 代码置于 if __name__ == "__main__": 块的保护之下。阅读文档。 docs.python.org/3.7/library/multiprocessing.html 并搜索“安全导入主模块”
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多