如何在python中将类作为进程运行
我试图同时在python中打开几个串行端口。我认为将每个端口作为一个类进程是有意义的,然后我可以在其中对各自的属性和方法进行分组。好的,我认为多重处理可以很好,但我一直在努力让它发挥作用如何在python中将类作为进程运行,python,multiprocessing,Python,Multiprocessing,我试图同时在python中打开几个串行端口。我认为将每个端口作为一个类进程是有意义的,然后我可以在其中对各自的属性和方法进行分组。好的,我认为多重处理可以很好,但我一直在努力让它发挥作用 为什么我不能在init中初始化串行端口 当使用super(serialManager,self)而不使用init时,将执行loop\u starter,但不会作为一个进程执行 super(serialManager,self)。\uuuuuu init(target=self.loop\u starter,ar
init
中初始化串行端口super(serialManager,self)
而不使用init
时,将执行loop\u starter
,但不会作为一个进程执行super(serialManager,self)。\uuuuuu init(target=self.loop\u starter,args=(串行端口,波特率,超时))
未执行,为什么from multiprocessing import Process
import serial
import time
class serialManager(Process):
def __init__(self, serial_port, baudrate=57200, timeout=1):
self.light = False
self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout) #1
#super(serialManager, self) #2
#self.loop_starter(serial_port, baudrate, timeout) #2
super(serialManager, self).__init__(target=self.loop_starter,args=(serial_port, baudrate, timeout)) #3
def loop_starter( self, serial_port, baudrate, timeout):
print("loop_iterator init")
ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)
self.loop(ser)
def loop(self, ser):
self.light = not (self.light)
values = bytearray([2, 82, 49, 4])
ser.write(values)
print("loop")
time.sleep(2)
#def run(self):
#print('run')
def main():
print("main")
if __name__ == "__main__":
msm = serialManager("COM7")
print ("inited")
try:
msm.start()
print ("started")
#while True:
#main()
except KeyboardInterrupt:
print("caught in main")
finally:
msm.join()
while True:
main()
time.sleep (1)
好的,我也试过这个小剧本,但没有成功。为什么不执行运行
from multiprocessing import Process
import time
class P(Process):
def __init__(self):
super(P, self).__init__()
def run(self):
print("run")
#time.sleep(0.5)
def main():
while True:
print("main")
time.sleep(2.5)
if __name__ == "__main__":
p = P()
p.start()
p.join()
main()
测试脚本可以很好地执行run()。根据: 如果子类重写构造函数,它必须确保调用 在执行任何操作之前,基类构造函数(Process.init()) 除此之外,其他方法也适用于该过程
您的
serialManager
类在末尾调用了super()
,而不是在\uuuuuu init\uuuuuu
您的测试脚本在python 3.6I下为我执行run,我看不出您有任何理由对进程进行子分类。这一切都可以通过进程(target=loop\u starter,args=(串口,波特率,超时))来实现。
。我注意到您进行了修改,但不要使用变量light
。关于进程间通信,您是否还没有展示一些东西?@dunes:好的,我应该把进程(target=loop\u starter,args=(serial\u port,baudrate,timeout))放在init内部的什么地方@manu在3.4.3中没有打印“run”。我只是在3.4.3中测试,“run”打印得很完美。但只有一次,我认为它会一直执行。