Python Web 应用程序 - 同步串行访问

发布于 2024-11-28 20:01:31 字数 740 浏览 3 评论 0原文

我是一名 Java 中级开发人员、Python 新手和 Web 服务超级新手。 作为一次学习经历,我正在尝试用 python 实现 RESTful Web 服务,以通过 RS232-over-USB 继电器板远程控制简单的开/关灯。 我已经了解了 web.py 和 web.py 的基础知识; pyserial 库。 我使用的板采用 ASCII 字节作为输入来打开/关闭继电器,并为每个发送的输入提供 ASCII 字节作为反馈。 单个请求会以正确的方式得到答复,但是当 web.py 委托类发出多个请求时,反馈有时会变得混乱。我猜这是一个线程同步问题。 为了将反馈正确发送到适当的 web.py 线程,将串行端口的写/读访问与 pyserial 同步的最佳方法是什么?像下面这样的解决方案可以被认为是正确的吗?

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

I'm a java intermediate developer, python newbie and web-services uber newbie.
As a learning experience, I'm trying to realize a RESTful web service in python to remotely control a simple on/off light via an RS232-over-USB relay board.
I already figured out the basics of web.py & pyserial libraries.
The board I am using takes an ascii byte as input to turn relays on/off and provides an ascii byte as a feedback for every input sent.
Single requests are answered in the correct way but, when multiple requests are issued by web.py delegated class, feedbacks sometimes get mixed up. I'm guessing this is a thread synchronization problem.
What's the best way to synchronize write/read access to the serial port with pyserial in order to correctly send feedbacks to the appropriate web.py-born thread? Could a solution such as the following one be considered as correct?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野侃 2024-12-05 20:01:31

如果您的 Web 应用程序在同一 python 实例下运行(在 web.py dev webserver 中集成运行),您的解决方案似乎没问题。

但如果你想在多个 Python 进程下运行它,那么你必须使用 fcntl 模块对文件本身加锁。

Your solution seems OK if your web app is run under the same python instance (running integrated in web.py dev webserver).

But if you want to run it under multiple Python processes, then you have to put the lock on the file itself using fcntl module.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文