multiprocessing 进程在创建时直接开始

multiprocessing process gets started directly at creation

嗨,我在 python 3.7 中遇到多处理问题 我做了一个监听器,它应该等待服务器的响应而不会阻塞程序的其余部分(异步通信):

self = cl.appendSend('bar', base_list)
print("client erstellt neuen nebenläufigen listener, für die Antwort des Servers")
multiprocessing.set_start_method("spawn")
queue = multiprocessing.Queue()
process = multiprocessing.Process(target = cl.appendResponse(), args=(self))
process.start()
print("listener aktiv")

thread = threading.Thread(target= waitingPrinter(), args=(process, queue))
print(thread)

是一切开始的地方 但是 process = multiprocessing.Process(target = cl.appendResponse(), args=(self)) 行开始了一次,运行s 结束,然后在完成后,它再次 运行s。调试器永远不会离开这一行。

过程中的方法运行为:

 def appendResponse(self):
        print("nebenläufiger listener aktiv")
        msgrcv = self.chan.receive_from(self.server)
        print("nebenläufiger listener hat Antwort erhalten")
        return msgrcv  # pass it to caller

遗憾的是,由于版权问题,我真的不能 post 更多,但是方法 运行 第一次通过很好,第二次失败并显示消息: 追溯(最近一次通话最后一次):

> File "D:/Verteile Systeme 2/neues Lab/git/vs2lab/lab2/rpc/runcl.py",
> line 27, in <module>
>     process = multiprocessing.Process(target = cl.appendResponse(), args=(self))   File "C:\Program Files
> (x86)\Python37-32\lib\multiprocessing\process.py", line 82, in
> __init__
>     self._args = tuple(args) TypeError: 'Client' object is not iterable

所以我想知道,为什么 cl.appendResponse() 的进程甚至在绑定到进程时就开始了,而不是等待 process.start() 如果还没有在答案中,为什么它然后 运行 直接第二次。当然,我该如何解决。

还有没有办法用线程替换处理并仍然得到 return 值? 我在处理和 return 值方面遇到了很多麻烦。

target = cl.appendResponse() 将 运行 函数和 return 结果作为目标。 正确的语法是 target=cl.appendResponse,它将告诉 Process 在 start() 上 运行 cl.appendResponse。

philipp 在他们的 .
中正确地陈述了进程明显立即执行的原因 Processtarget 参数采用一个可调用对象,该对象将由 run() 方法调用。您的代码传递 self.chan.receive_from(self.server).
返回的任何内容 在行 process = multiprocessing.Process(target = cl.appendResponse(), args=(self)) 中或从行 process = multiprocessing.Process(target = cl.appendResponse(), args=(self)) 中没有子进程 运行ning。您的方法 运行 在主进程中并阻止了它。
旁注:您的 thread 会遇到完全相同的问题,原因相同:thread = threading.Thread(target= waitingPrinter(), args=(process, queue))

在您的方法在主进程中执行完毕后,进程对象的初始化引发 TypeError inside the __init__ method of the BaseProcess class
您将参数 self 传递给您的进程,但您没有正确执行。 args 参数需要一个参数元组。如果仅指定单个值,则通过文字创建元组需要尾随逗号:args=(self,)。您的代码有效地传递了 self,即直接传递了一个 Client 对象,它是不可迭代的,因此会导致错误。
在您的情况下,appendResponse 似乎是一个绑定方法Client 对象的。它将通过 Python 的 class 系统的内部运作接收 self 参数。通过该过程显式传递它会引发另一个 TypeError 用于将两个位置参数传递给只接受一个的方法。除非 appendSend returns 您调用它的 Client 实例 cl 之外的其他东西,否则在进程实例化中删除 args 参数。

另一方面注意:启动方法 spawn 是 Windows 上唯一可用的方法,因此是默认方法。除非您的代码需要在 Unix 下使用该启动方法 运行,否则此行是多余的:multiprocessing.set_start_method("spawn")