如何防止并发访问USB设备等资源?

时间:2013-08-06 19:40:21

标签: python concurrency locking semaphore superglobals

我希望能够使用多个应用程序中的USB设备(例如我运行Flask Web应用程序),确保一次只使用一个。

在我的情况下,我使用继电器打开/关闭一扇门。门需要大约20秒才能打开。在此期间,不应激活继电器,因为这会将门锁在中间。

提前致谢!

3 个答案:

答案 0 :(得分:1)

不完全是你问题的答案,但也许是关于如何解决这个问题的另一个想法,而不是使用全局变量。

为什么不编写一个用于控制USB设备的小程序。此脚本在您的服务器上运行一次(一个实例),并负责以您需要的方式与设备通信。它还兼顾并发性。

现在通过管道,套接字,无论使用此脚本从您的Web应用程序进行通信,向其发送命令并从中接收结果。

答案 1 :(得分:0)

您有许多可能的解决方案。

posix_ipcsysv_ipc Python模块提供了一个命名的信号量类。您可以将信号量初始化为1,并让所有Web进程在向USB设备发送命令时获取信号量。

使用文件锁可以实现一种类似的机制,可能使用fcntl.lockf

另一种完全不同的方法可能是在您的Web服务器进程和USB API之间建立一个新进程。此过程公开了一个API,该API接收来自Web服务器工作者的请求,并通过单线程进程将这些请求隐式序列化到USB设备中。

答案 2 :(得分:0)

您可以在配置中添加变量(确保它是大写的)

app.config['YOUR_GLOBAL'] = 'your global'

http://flask.pocoo.org/docs/config/