Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将类作为进程运行_Python_Multiprocessing - Fatal编程技术网

如何在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

我试图同时在python中打开几个串行端口。我认为将每个端口作为一个类进程是有意义的,然后我可以在其中对各自的属性和方法进行分组。好的,我认为多重处理可以很好,但我一直在努力让它发挥作用

  • 为什么我不能在
    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”打印得很完美。但只有一次,我认为它会一直执行。