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 在他们的 .
中正确地陈述了进程明显立即执行的原因
Process
的 target
参数采用一个可调用对象,该对象将由 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")
嗨,我在 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 在他们的
中正确地陈述了进程明显立即执行的原因
Process
的 target
参数采用一个可调用对象,该对象将由 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")