gpt4 book ai didi

具有 multiprocessing.Manager 的 Python multiprocessing.Process 对象在 Windows 任务管理器中创建多个多处理分支

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:56 27 4
gpt4 key购买 nike

我在 Windows Standard Embedded 7 上运行 python 3.4.3。我有一个继承 multiprocessing.Process 的类。

在类的 run 方法中,我为进程对象创建了一个线程以启动。

在查看任务管理器时,特别是命令行列,当进程类被实例化时,我看到了 'from.multiprocessing.spawn import spawn_main(parent_pid=XXXX, pipe_handle=XXXX)""--multiprocessing-fork'。

当进程中的线程启动时,我看到另一个来自同一父进程 ID 的 pythonw.exe 多处理分支。当线程完成时,单独的进程结束。

为什么在单独的进程中创建线程会导致产生另一个多处理分支?

感谢任何见解。如果有帮助会发布,但我想我会更笼统地问这是否是预期的行为。

编辑

抱歉,我花了一些测试代码来演示我所看到的行为。不幸的是,我没有提到我还将一个 multiprocessing.Manager Namespace 对象传递给了进程对象。下面的代码演示了我认为应该发生的情况,子进程中产生了多个线程,任务管理器中只显示了一个多处理分支。

import multiprocessing
import threading
import time

class Comm(multiprocessing.Process):
def __init__(self):#, namespace=None):
multiprocessing.Process.__init__(self)
#self.namespace=namespace
self.comm_queue=multiprocessing.Queue()

def talk(self):
counter=0
while counter != 4:
self.comm_queue.put('i am talking')
time.sleep(2)
counter += 1

def yell(self):
counter=0
while counter != 3:
self.comm_queue.put('I AM YELLING')
time.sleep(5)
counter += 1

def make_threads(self):
self.talk_thread=threading.Thread(target=self.talk)
self.yell_thread=threading.Thread(target=self.yell)


def run(self):
self.make_threads()
self.talk_thread.start()
self.yell_thread.start()
while True:
time.sleep(1)


if __name__=='__main__':
#test_manager=multiprocessing.Manager()
#test_ns=test_manager.Namespace()
test=Comm()#namespace=test_ns)
test.start()
while True:
message=test.comm_queue.get()
print(message)

但是,如果您取消注释所有内容并传入 Namespace 对象,我会看到生成了两个多处理分支。为什么 multiprocessing.Manager()/Namespace() 包含在进程对象中会发生这种情况?

最佳答案

multiprocessing.Manager通过生成一个单独的 Manager 服务器进程来工作,该进程将一直运行直到 Manager 被垃圾回收:

Managers provide a way to create data which can be shared between different processes. A manager object controls a server process which manages shared objects. Other processes can access the shared objects by using proxies.

因此,您看到的两个过程是预期的;一个是您的 multiprocessing.Process 子类,另一个是 multiprocessing.Manager 服务器进程。

关于具有 multiprocessing.Manager 的 Python multiprocessing.Process 对象在 Windows 任务管理器中创建多个多处理分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29970877/

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