Невозможно реализовать многопроцессорность в python (неверный параметр) - PullRequest
0 голосов
/ 02 ноября 2019

РЕДАКТИРОВАТЬ

Я пытаюсь запустить функции одновременно, используя многопроцессорную обработку

import serial
import time

from multiprocessing import Process
import sys

sertx = serial.Serial('COM4', 115200)
serrx = serial.Serial('COM3', 115200)

rx_t=0
tx_t=0

def rx(serrx):

    global rx_t

    while True:
        print("hi")
        read_serial=serrx.readline()
        rx_t = time.time()
        print(read_serial)
        print('rx: ',rx_t)

def tx(sertx):
    print("started")
    global tx_t
    while True:

        msg = str(1)
        # print('sending: ',msg.encode())

        msgstat = 'A' + msg
        #print(msgstat)
        #print(type(msgstat))
        tx_t = time.time()
        sertx.write(msg.encode())
        print('tx: ',tx_t)

if __name__ == '__main__': 
    p1 = Process(target=tx,args=(sertx,))
    p2 = Process(target=rx,args=(serrx,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

Ошибка

Traceback (most recent call last):
  File "c:/Users/ambuj/Documents/Python Scripts/wave.py", line 58, in <module>
    p1.start()
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
ValueError: ctypes objects containing pointers cannot be pickled
PS C:\Users\ambuj\Documents\Python Scripts> Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\spawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "C:\Users\ambuj\Anaconda3\lib\multiprocessing\reduction.py", line 82, in steal_handle
    _winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

В основном то, что я делаю / хочу сделать

У меня есть передатчик, который продолжает передавать данные, и у меня есть приемник, который продолжает получать данные. Когда я передаю данные, я записываю время, когда я получаю данные, я записываю их время. Скрипты работают постоянно. Я запускаю эти сценарии параллельно. Поскольку я хочу запускать эти сценарии одновременно, я использую многопроцессорность.

Спасибо

1 Ответ

1 голос
/ 02 ноября 2019

Я уверен, что вам не нужно использовать многопроцессорный модуль для такого рода операций, он используется для ускорения вычислений. Я предполагаю, что вы хотите читать из одного порта и записывать в другой в одном процессе, в противном случае вы можете просто писать в разные программы и запускать их независимо. Для IN / OUT используется модуль потоков.

Я никогда не работал с последовательной библиотекой, но знаю, как создать процесс, который прослушивает ввод в одном потоке и печатает в другом потоке:

Это моя программа обмена сообщениями

Я думаю, что код может работать следующим образом:

import serial
import time
from threading import Thread


def rx(_ser_rx):
    while True:
        print("hi")
        read_serial = _ser_rx.readline()
        rx_t = time.time()
        print(read_serial)
        print('rx: ', rx_t)


def tx(_ser_tx):
    print("started")
    while True:
        msg = "1"
        tx_t = time.time()
        _ser_tx.write(msg.encode())
        print('tx: ', tx_t)


if __name__ == '__main__':
    ser_tx = serial.Serial('COM4', 115200)
    ser_rx = serial.Serial('COM3', 115200)
    t1 = Thread(target=rx, args=(ser_rx,),)
    t2 = Thread(target=tx, args=(ser_tx,))
    t1.start()
    t2.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...