Python 混合多处理和串行端口

Python 混合多处理和串行端口,python,class,multiprocessing,port,pyserial,Python,Class,Multiprocessing,Port,Pyserial,我编写了一个继承multiprocess.Process()的类。它在类属性中保存一个serial.serial()对象。方法self.loop()应该从串行端口读写。调用self.loop()时,它应该作为一个单独的进程运行,这是要求我编写本文的人的要求。然而,我的代码产生了一个奇怪的错误 这是我的代码: from multiprocessing import Process import serial import time class MySerialManager(Process)

我编写了一个继承multiprocess.Process()的类。它在类属性中保存一个serial.serial()对象。方法self.loop()应该从串行端口读写。调用self.loop()时,它应该作为一个单独的进程运行,这是要求我编写本文的人的要求。然而,我的代码产生了一个奇怪的错误

这是我的代码:

from multiprocessing import Process

import serial
import time


class MySerialManager(Process):
    def __init__(self, serial_port, baudrate=115200, timeout=1):
        super(MySerialManager, self).__init__(target=self.loop)
        # As soon as you uncomment this, you'll get an error.
        # self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)

    def loop(self):
        # Just some simple action for simplicity.
        for i in range(3):
            print("hi")
            time.sleep(1)


if __name__ == "__main__":
    msm = MySerialManager("COM14")
    try:
        msm.start()
    except KeyboardInterrupt:
        print("caught in main")
    finally:
        msm.join()
这就是错误:

Traceback (most recent call last):
  File "test.py", line 22, in <module>
    msm.start()
  File "C:\Python\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Python\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Python\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Python\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
ValueError: ctypes objects containing pointers cannot be pickled

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 26, in <module>
    msm.join()
  File "C:\Python\Python36\lib\multiprocessing\process.py", line 120, in join
    assert self._popen is not None, 'can only join a started process'
AssertionError: can only join a started process
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python\Python36\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Python\Python36\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
进入课堂

try:
    msm.proc.start()
except KeyboardInterrupt:
    print("caught in main")
finally:
    msm.proc.join()
进入主街区。他们俩都没有解决这个问题


有人指出,混合使用多处理和串行端口似乎行不通。这是真的吗?如果是的话,你能给我解释一下为什么这不起作用吗?非常感谢您的帮助

在windows中,创建的串行对象不能在两个进程(即父进程和子进程)之间共享 因此,在子进程中创建串行对象,并将该对象的引用作为参数传递给其他函数

试试这个:

from multiprocessing import Process

import serial
import time


class MySerialManager(Process):
    def __init__(self, serial_port, baudrate=115200, timeout=1):
        super(MySerialManager, self).__init__(target=self.loop_iterator,args=(serial_port, baudrate, timeout))
        # As soon as you uncomment this, you'll get an error.
        # self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)

    def loop_iterator(self,serial_port, baudrate,timeout):
        ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)
        self.loop(ser)

    def loop(self,ser):
        # Just some simple action for simplicity.
        # you can use ser here
        for i in range(3):
            print("hi")
            time.sleep(1)


if __name__ == "__main__":
    msm = MySerialManager("COM4")
    try:
        msm.start()
    except KeyboardInterrupt:
        print("caught in main")
    finally:
        msm.join()

谢谢你,你救了我一天。是否有引用该对象的文档无法共享?
from multiprocessing import Process

import serial
import time


class MySerialManager(Process):
    def __init__(self, serial_port, baudrate=115200, timeout=1):
        super(MySerialManager, self).__init__(target=self.loop_iterator,args=(serial_port, baudrate, timeout))
        # As soon as you uncomment this, you'll get an error.
        # self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)

    def loop_iterator(self,serial_port, baudrate,timeout):
        ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)
        self.loop(ser)

    def loop(self,ser):
        # Just some simple action for simplicity.
        # you can use ser here
        for i in range(3):
            print("hi")
            time.sleep(1)


if __name__ == "__main__":
    msm = MySerialManager("COM4")
    try:
        msm.start()
    except KeyboardInterrupt:
        print("caught in main")
    finally:
        msm.join()