Стоп. Основная идея машины состояний - разделение входов, выходов и
не-асинхронность. Иначе гонки можно и без очередей получить. Повторюсь, введение сущностей, которые "знают кому нужно" не является абсолютно необходимым.
ЛЕММА: Правильно спроектированная система конечных автоматов - максимально эффективна.
Любой "внешний" по отношению к ней трюк, эффективнее реализуется внутри нее.
Но требует "дисциплины проектирования" (и это единственная проблема).
Под "очередью событий" понимаю особый тип входа конечного автомата.
Никаких "подписок" и "активаций", да вопрос необходимой глубины очереди - реален,
но если не лезть создавать глобальные абстрактные сущности, а проектировать
сугубо в прикладных контекстах, то и ответы легко найдутся (бесконечность бывает только среди абстракций).
Да, теоретически хотелось бы "разгрузить прикладного программиста" и "сделать за него всю работу".
На практике это обычно выливается только и исключительно в пустые абстракции.
События не появляются "сами собой", их генерируют в абсолютно таком же if-е, только перенесенном
со стороны приемника, на сторону источника (с дополнительными издержками на "сигнализацию").
Ни одно животное не пострадало Ни одного такта экономии!