嗨,我在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))
行只启动一次,一直运行,然后完成,然后再次运行。调试器永远不会离开这一行。
该过程中运行的方法是:
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
由于版权的原因,我无法真正发布更多内容,但是该方法第一次运行良好,而第二次失败并显示以下消息: 追溯(最近一次通话):
> 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()
,如果还没有答案,那为什么呢?再次直接运行。当然,我该如何解决。
还有没有一种方法可以用线程替换处理并仍然获得返回值? 我在处理和返回值时遇到很多麻烦。
答案 0 :(得分:1)
target = cl.appendResponse()
将运行该函数并将结果返回给目标。
正确的语法为target=cl.appendResponse
,它将告诉Process在start()上运行cl.appendResponse。
答案 1 :(得分:1)
philipp在其answer中正确地指出了明显立即执行该过程的原因。
Process
的cmd C:\users\RGilsburg\Desktop\a\untitled1.py
参数采用一个可调用对象,该对象将由target
方法调用。您的代码将传递run()
返回的内容。
self.chan.receive_from(self.server)
行中没有任何子进程正在运行。您的方法在主进程中运行并阻止它。
附带说明:出于相同的原因,您的thread
将遇到完全相同的问题:process = multiprocessing.Process(target = cl.appendResponse(), args=(self))
您的方法在主流程中完成执行后,流程对象的初始化将引发TypeError
inside the __init__
method of the BaseProcess
class。
您将一个参数thread = threading.Thread(target= waitingPrinter(), args=(process, queue))
传递给了您的过程,但是这样做不正确。 self
参数需要一个参数元组。如果仅指定一个值:args
,则通过文字创建元组需要用逗号结尾。您的代码有效地直接传递了args=(self,)
,即self
对象,该对象不可迭代,因此会导致错误。
在您的情况下,Client
似乎是绑定方法appendResponse
对象。它将通过Python的类系统的内部工作原理接收Client
参数。将其显式传递给整个过程将引发另一个self
,用于将两个位置参数传递给只需要一个的方法。除非您调用TypeError
实例appendSend
以外的实例Client
,否则请在流程实例中删除cl
参数。
另一方面,启动方法args
是Windows上唯一可用的方法,因此是默认方法。除非您的代码需要使用该start方法在Unix下运行,否则此行是多余的:spawn