【问题标题】:Python multiprocessing giving two different pid for same objectPython多处理为同一对象提供两个不同的pid
【发布时间】:2022-01-10 16:22:37
【问题描述】:

我正在使用 Windows

import multiprocessing
import os
class BaseModule(multiprocessing.Process):
    def __init__(self):
        print("Initialize time pid: ",os.getpid())
        multiprocessing.Process.__init__(self)
        super().__init__()

    def get_pid(self):
        print("After new process pid: ",os.getpid())

    def run(self):
        self.get_pid()
        
if __name__ == '__main__':
    process = BaseModule()
    process.start()

输出:

Initialize time pid:  22148
After new process pid:  21244

在这里,同一个对象得到两个不同的 pid 我需要 使用多处理(相同的 pid)创建完整的对象并在新进程中运行?

【问题讨论】:

  • multiprocessing.Process.__init__(self)super().__init__() 是多余的。摆脱其中之一。除此之外,这是预期的行为:进程对象首先在主进程“初始化时间”中创建,然后在“新进程之后”在单独的进程中执行。当对象被复制到新进程时,__init__ 不会被调用。如果您需要一个在另一端创建时被调用的方法,您需要覆盖 __new____getstate____setstate__(请注意,这仅在使用“spawn”上下文时有效,而不是与“fork”一起使用")

标签: python multiprocessing python-multiprocessing


【解决方案1】:

我找到了一种方法,在这里我使用了一个函数来创建对象。现在我得到了相同的 pid。

import multiprocessing
import os

class BaseModule:
    def __init__(self):
        print("Initialize time pid: ",os.getpid())

    def get_pid(self):
        print("After new process pid: ",os.getpid())

    def run(self):
        self.get_pid()

def use_multiprocessing():
    obj = BaseModule()
    obj.run()

if __name__ == '__main__':
    process = multiprocessing.Process(target=use_multiprocessing)
    process.start()

输出

Initialize time pid:  18240
After new process pid:  18240

【讨论】:

  • 是的,但是您了解为什么您的初始代码会如此行事,即打印两个不同的进程 ID?
  • @Booboo 据我所知,在主进程中初始化对象并在初始化多进程之后启动“运行”功能作为新进程。对吗?
  • 是的,run 方法在新进程中执行。还有一个额外的细节:你在主进程中用obj = BaseModule() 实例化了你的BaseModule 实例,所以BaseModule.__init__ 是在主进程中运行的。但是当run方法执行时,它是由新进程完成的,因此在主进程中创建的BaseModule实例必须首先通过序列化然后使用模块反序列化实例转移到新进程的地址空间pickle。实际上,run 方法正在使用原始BaseModule 实例的副本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2012-12-05
相关资源
最近更新 更多