簡體   English   中英

如何在python中將類作為進程運行

[英]how to run a class as a process in python

我試圖同時在python中打開幾個串行端口。 我認為將每個端口作為一個類進程是有意義的,然后可以在其中將各自的屬性和方法分組。 好的,我認為多處理可能很好,但是我一直在努力使其工作。

  1. 為什么我不能在init初始化串行端口。

  2. 使用不帶initsuper(serialManager, self) ,將執行loop_starter ,但不作為進程執行。

  3. super(serialManager, self).__init__(target=self.loop_starter,args=(serial_port, baudrate, timeout))未執行,為什么?

如何正確地將所有道具放在一個類中並在該類中處理一個方法?

問候

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類在最后而不是__init__ serialManager調用super()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM