Как предотвратить одновременный доступ к ресурсу, такому как 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'