我正在尝试根据此图编写一个通过pyserial与硬件接口的程序 https://github.com/kiyoshi7/Intrument/blob/master/Idea.gif。 我的问题是我不知道如何告诉子进程运行方法。
我试图将我的问题简化为我正在尝试做的事情的本质,可以从主脚本调用方法request((。我只是不知道如何处理这样的双向通信,在使用队列的示例中,我只看到共享的数据或我无法理解示例
import multiprocessing
from time import sleep
class spawn:
def __init__(self, _number, _max):
self._number = _number
self._max = _max
self.Update()
def request(self, x):
print("{} was requested.".format(x))
def Update(self):
while True:
print("Spawned {} of {}".format(self._number, self._max))
sleep(2)
if __name__ == '__main__':
p = multiprocessing.Process(target=spawn, args=(1,1))
p.start()
sleep(5)
p.request(2) #here I'm trying to run the method I want
更新感谢癌化
import multiprocessing
from time import sleep
from operator import methodcaller
class Spawn:
def __init__(self, _number, _max):
self._number = _number
self._max = _max
# Don't call update here
def request(self, x):
print("{} was requested.".format(x))
def update(self):
while True:
print("Spawned {} of {}".format(self._number, self._max))
sleep(2)
if __name__ == '__main__':
spawn = Spawn(1, 1) # Create the object as normal
p = multiprocessing.Process(target=methodcaller("update"), args=(spawn,)) # Run the loop in the process
p.start()
while True:
sleep(1.5)
spawn.request(2) # Now you can reference the "spawn"
你需要重新安排一下。我不会从构造函数做长时间运行(无限(的工作。这通常是不好的做法,并且使这里的事情复杂化。相反,我会初始化对象,然后在单独的进程中运行循环:
from operator import methodcaller
class Spawn:
def __init__(self, _number, _max):
self._number = _number
self._max = _max
# Don't call update here
def request(self, x):
print("{} was requested.".format(x))
def update(self):
while True:
print("Spawned {} of {}".format(self._number, self._max))
sleep(2)
if __name__ == '__main__':
spawn = Spawn(1, 1) # Create the object as normal
p = multiprocessing.Process(target=methodcaller("update"), args=(spawn,)) # Run the loop in the process
p.start()
spawn.request(2) # Now you can reference the "spawn" object to do whatever you like
不幸的是,由于Process
要求它target
参数是可腌制的,你不能像我最初那样只使用lambda
包装器(哎呀(。我正在使用operator.methodcaller
来创建可腌制的包装器。methodcaller("update")
返回一个函数,该函数调用update
给定的任何内容,然后我们给它spawn
调用它。
您还可以使用def
创建一个包装函数:
def wrapper():
spawn.update()
. . .
p = multiprocessing.Process(target=wrapper) # Run the loop in the process
但这只有在将wrapper
作为全局函数是可行的时才有效。您可能需要尝试找出最有效的方法,或者使用不需要可挑剔任务的多处理库。
请注意,请使用正确的 Python 命名约定。类名以大写字母开头,方法名小写。我在我发布的代码中修复了这个问题。