Стоит отметить, что каждый вызов BAC0.device
зависит от потока, который bacpypes
(модуль, который управляет связью BACnet) создает при создании сети BACNET. И этот поток заставляет все сетевые вызовы выполняться один за другим.
Bacpypes (из-за того, как работает BACnet) будет держать сокет открытым до тех пор, пока он работает, поэтому вы не сможете запускать несколько экземпляров bacnet, работающих одновременно ... вам потребуется более одного сетевого адаптера (или любой другой трюк, который позволил бы открыть новый сокет), чтобы сделать это асинхронным.
Если вы хотите набрать скорость, я думаю, что вы получите лучшие результаты, определяя все устройства в глобальном масштабе, и используйте собственные списки объектов, чтобы уменьшить количество точек.
После определения все устройства будут обновляться в фоновом режиме. Затем вы можете использовать
dev[“MyPoint”].lastValue
Хитрость, заставляющая ваш софт использовать последнее значение опроса (вместо принудительного нового чтения в сети)
Если вы действительно хотите использовать асинхронное соединение и ожидать подключения к BACnet, вам, вероятно, следует начать с самого bacpypes. Я знаю, что Джоэл думает о том, как сделать модуль асинхронным, но он еще далеко. Но BAC0 является не более чем «оболочкой» вокруг bacpypes, он действительно «синхронный».
Если BAC0 будет использоваться внутри асинхронного приложения, я думаю, что есть несколько «способов» работать с синхронными вещами, но на этом мои знания об асинхронности и ожидании заканчиваются.
Кстати, если вы добьетесь некоторого прогресса в этом, не стесняйтесь заглянуть в Github и оставить что-нибудь! Мне действительно интересно узнать, что делается с BAC0.