Как предотвратить одновременный доступ к ресурсу, такому как USB-устройство?

Я хотел бы иметь возможность использовать устройство USB из нескольких приложений (например, я запускаю веб-приложение Flask), следя за тем, чтобы только одно оно использовало одновременно.

В моем случае я использую реле, чтобы открыть / закрыть дверь. Дверь занимает около 20 секунд, чтобы открыть. В течение этого времени реле не должно быть активировано, потому что это заблокирует дверь посередине.

Заранее спасибо!

3 ответа

Решение

У вас есть ряд возможных решений.

Модули Python posix_ipc или sysv_ipc предоставляют именованный класс семафоров. Вы можете инициализировать семафор равным 1, и все ваши веб-процессы получат семафор при отправке команды на устройство USB.

Несколько похожий механизм может быть реализован с помощью блокировки файлов, например, с помощью fcntl.lockf.

Другим совершенно другим подходом может быть установка нового процесса между процессами вашего веб-сервера и USB API. Этот процесс предоставляет API, который получает запросы от работников веб-сервера и неявно сериализует их на USB-устройство, будучи однопоточным процессом.

Не совсем ответ на ваш вопрос, но, возможно, другая идея о том, как справиться с этим, используя глобальные переменные.

Почему бы вам не написать небольшую программу для управления вашим USB-устройством. Этот скрипт запускается один раз (один экземпляр) на вашем сервере и обеспечивает связь с устройством так, как вам нужно. Это также заботится о параллелизме.

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

Вы можете добавить переменную в вашу конфигурацию (убедитесь, что она прописная)

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

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

Другие вопросы по тегам