多处理过程在创建时就直接开始

时间:2019-05-22 11:32:29

标签: python multithreading python-multiprocessing

嗨,我在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(),如果还没有答案,那为什么呢?再次直接运行。当然,我该如何解决。

还有没有一种方法可以用线程替换处理并仍然获得返回值? 我在处理和返回值时遇到很多麻烦。

2 个答案:

答案 0 :(得分:1)

target = cl.appendResponse()将运行该函数并将结果返回给目标。 正确的语法为target=cl.appendResponse,它将告诉Process在start()上运行cl.appendResponse。

答案 1 :(得分:1)

philipp在其answer中正确地指出了明显立即执行该过程的原因。 Processcmd 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