Многопроцессор с серийным объектом в качестве параметра

У меня проблема с Python и передача серийного объекта в качестве параметра отдельному процессу. Программа запускается в Windows 8, поэтому использование глобальных переменных не является вариантом.

from multiprocessing import Queue from multiprocessing import Process import os import serial from serial.tools import list_ports from time import sleep displayMessages = Queue() modemPort = None def processDisplayMessages(displayMessages): while True: msg = displayMessages.get() #should halt until message in queue print msg def processIncomingSerialMessages(modemPort, displayMessages): while True: line = modemPort.readline() displayMessages.put(line) def main(): print "Serial Send Test" Process(target=processDisplayMessages, args = (displayMessages,)).start() modemPort = serial.Serial('COM5', 57600, timeout=0.9) # open first serial port Process(target=processIncomingSerialMessages, args = (modemPort, displayMessages)).start() print "Back from launch" sleep(0.1) if __name__ == '__main__': main() 

Когда программа запускается, я получаю следующую ошибку:

 Процесс процесса-2:
 Traceback (последний последний вызов):
   Файл «c: \ python27 \ lib \ multiprocessing \ process.py», строка 258, в _bootstrap
     self.run ()
   Файл «c: \ python27 \ lib \ multiprocessing \ process.py», строка 114, в запуске
     self._target (* self._args, ** self._kwargs)
   Файл "C: \ Users \ matthew.parets \ Documents \ .. Разработка \ RaspberryPi \ windows \ seri
 alRecvPrototype.py ", строка 27, in processIncomingSerialMessages
     line = modemPort.readline ()
   Файл «c: \ python27 \ lib \ site-packages \ serial \ serialwin32.py», строка 246, в read
     если не self.hComPort: поднять portNotOpenError
 AttributeError: объект «Serial» не имеет атрибута «hComPort»

Если я поместил открытый для последовательного порта (modemPort) в качестве первой строки processIncomingSerialMessages, программа работает нормально. Проблема в том, что мне нужно отделить ввод и вывод от модема, поэтому мне нужно передать серийный объект в качестве параметра. И Python, похоже, не нравится.

Может ли кто-нибудь увидеть ошибку, которую я делаю, или кто-нибудь может предложить альтернативу?

    One Solution collect form web for “Многопроцессор с серийным объектом в качестве параметра”

    Я не могу запустить этот код, но я был бы поражен, если бы это сработало: аргумент, передаваемый процессам, выполняется путем травления объекта аргумента на стороне отправки, отправки строки рассола через процессы через трубу или сокет и рассыпания этого строка на принимающей стороне. Я не знаю ни одного случая открытого типа ввода-вывода, для которого это возможно (файлы, сокеты, трубы …). I / O-виды-объекты не просто имеют внутреннее состояние данных, они также связаны с ресурсами, которые сам Python не реализует. Рассол – это просто поток необработанных байтов.

    Вы уже поняли, что вам нужно открыть последовательный порт в рабочем процессе. Увы, я не знаю, что значит «мне нужно отделить ввод и вывод от модема», поэтому трудно предложить обходной путь. Но я уверен, что вы поймете это, если вы согласитесь с тем, что уже обнаружил трудный путь: передача открытого серийного объекта через процессы никогда не сработает.

    Тем не менее, вы могли бы вникать в различные протоколы травления и создавать свой собственный класс с помощью настраиваемого кода травления / распиловки, который (повторно) открывал серийный объект при рассыпании. Это было бы сложным способом скрыть то, что в противном случае было бы простым кодом для (повторного) открытия серийного объекта в рабочих процессах.

    EDIT: вопросы и ответы

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

    «Глобальная переменная», вероятно, не поможет вам. Я предполагаю, что у вас есть fork() , но ничто не делится между fork() : дочерние процессы видят копии адресного пространства родительского процесса. Трюки ввода-вывода часто также не работают правильно.

    Предоставляет ли Python способ передать значение по ссылке или ссылочное значение для процесса? Я попытался добавить серийный объект в списки и наборы с теми же результатами. Опять же, делает ли Python что-то вроде Object или Array с Java, где я мог бы получить ссылку, не будучи «замаринованной»?

    Между процессами во всех современных операционных системах существует очень высокая стена. Чтобы получить что-либо действительно разделенное между процессами, вам нужно использовать типы, созданные с нуля для этого, или использовать возможности «общей памяти» ОС.

    Вы можете прочитать документы для multiprocessing.sharedctypes , который предоставляет способы использования общей (в разных процессах) памяти. Но, как предупреждают документы:

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

    Это не сработает. Это не проблема с языком программирования, это проблема ОС. sharedctypes полезен для таких вещей, как массивы int и floats.

    Чтобы это приложение работало (живая телеметрия), процесс приема должен постоянно оставаться в режиме реального времени.

    Извините, я не следую этому в контексте. Вы сказали в своем вопросе: «Если я поместил открытый для последовательного порта (modemPort) в качестве первой строки processIncomingSerialMessages, программа отлично работает». После этого processIncomingSerialMessages имеет бесконечный цикл. В каком смысле это нарушает «процесс получения должен постоянно оставаться в живых»?

    В коде, который вы показали, не кажется, что лижет разницы, открыт ли последовательный порт в рабочем процессе или в основном процессе (если последний фактически работал), и, действительно, вы сказали, что он работает нормально, если вы это сделали это прежний путь. Итак, что именно не так с этим? Действительно, зачем вообще использовать рабочий процесс? Основная программа, которую вы показали, ничего не делает (кроме сна на десятую часть секунды) после запуска обоих рабочих, так почему бы не позволить основной программе быть «процессом приема»?

    Python - лучший язык программирования в мире.