Вы бы предпочли держаться подальше от голосования. Синхронные операции будут лучше масштабироваться и их будет легче отлаживать. Если у вас есть контроль над внешним протоколом, сделайте его синхронизированным. Я говорю это в основном потому, что я думаю, что многие люди делают вещи асинхронными, думая, что каким-то образом улучшает производительность, когда это действительно только усложняет ситуацию.
Затем вы можете сделать операции синхронизации асинхронными для вашего локального цикла обработки событий, используя несколько потоков управления (потоки, процессы, выбранные автоматы FSM и т. Д.). Если у вас нет контроля над внешним протоколом, и он действительно асинхронный, у вас нет другого выбора, кроме как опросить. В зависимости от того, что, по вашему мнению, будет распределено время отклика, я бы использовал некоторый экспоненциальный откат с ограничением на период опроса. Для большинства программ я бы использовал это внешнее по отношению к моему главному циклу событий и передавал его через какой-либо механизм событий в мой цикл событий.