Веб-приложение Python - синхронизированный последовательный доступ - PullRequest
3 голосов
/ 08 августа 2011

Я - Java-разработчик промежуточного уровня, новичок в Python и веб-сервисы Uber Newbie.Как опыт обучения, я пытаюсь реализовать веб-сервис RESTful на python для удаленного управления простым индикатором включения / выключения через релейную плату RS232 через USB.Я уже понял основы библиотек web.py и pyserial.Плата, которую я использую, принимает байт ascii в качестве входа для включения / выключения реле и предоставляет байт ascii в качестве обратной связи для каждого отправленного входа.Ответы на отдельные запросы выполняются правильно, но когда делегированный класс web.py отправляет несколько запросов, отзывы иногда путаются.Я предполагаю, что это проблема синхронизации потоков.Каков наилучший способ синхронизировать доступ на запись / чтение к последовательному порту с pyserial, чтобы правильно отправлять отзывы в соответствующий поток web.py?Может ли решение, подобное следующему, считаться правильным?

from threading import RLock
import serial   # pyserial library

lock = RLock()
ser = serial.Serial("/dev/ttyACM0", 9600, 1)

def serialOut(self, string):
    lock.acquire()
    data = ''
    try:
        ser.open()
        ser.write(string)
        data = ser.readall()
        ser.flushOutput()
    finally:
        lock.release()
        return data

1 Ответ

1 голос
/ 08 августа 2011

Ваше решение выглядит нормально, если ваше веб-приложение запущено под тем же экземпляром python (запущенным в веб-сервере web.py dev).

Но если вы хотите запустить его под несколькими процессами Python, то вам необходимо установить блокировку самого файла с помощью модуля fcntl.

...