Что если попытаться "сузить" так
...
Все примерно так (только лучше
) и работает. И цикл событий для очереди один. Все у меня работает замечательно.
Я же решал один нюанс - поставить в очередь синхронный вызов нереентерабельной функции. Видимо, это невозможно, по крайней мере, я пока способа не нашел. Поэтому я сделал просто - если вызов от клиента поступает запрос до удаления его предыдущего запроса, то просто игнорирую его. Обойдется, в рамках моей задачи это допустимо.
А в асинхронном режиме можно сделать вообще замечательно - процесс передачи и получения данных в шину никак не связан. При прочтении данных из порта посылать сигнал очереди, что шина свободна. И пожалуйста - передавай следующий запрос.
Но извиняйте - надежно связать запрос с ответом, если используется не Modbus TCP, вы не сможете. Разве что с высокой степенью вероятности (по адресу устройства и номеру функции).