Язык описания таких схем под названием Balsa использует формализм CSP (Communicating Sequential Processes) за авторством Тони Хоара, человека, подарившего нам NULL.
CSP, так же, используется в Go.
В Go для проведения одновременных транзакций над каналами используется выражение языка под названием select. Внутри select вы можете одновременно прочитать сколь угодно много каналов и записать, примерно, столько же.
В Balsa ровно то же самое: вы можете читать сколь угодно много входных каналов и, одновременно, потребовать записать сколь угодно много выходных каналов.
Проблема здесь в том, что мы можем получить deadlock, когда два процесса читают каналы друг друга, и livelock, когда один процесс всегда успевает прочитать (или записать) канал, прежде чем другой процесс успеет это сделать.
В Хаскеле каналы сделаны на MVar, операции с которыми определяют deadlock (взаимную блокировку). Против livelock каналы Хаскеля не защищают.
Вот.
Авторы
Caph утверждают, если мне не изменяет память, что размеры очередей между компонентами не могут быть вычислены, но может быть подобраны. Это можно перенести на самосинхронные схемы, на первый взгляд.
И, получается, что самосинхронные схемы надо проектировать несколько по-другому, нежели синхронные. В частности, инструменты должны определять возможность взаимных блокировок и добавлять необходимые элементы в очереди обмена данными.
PS
Теперь мне кажется, что звание
"сэра" Тони Хоару дали совсем не потому, почему мы все думаем. ;)
Впрочем, началось всё с Тьюринга, позволившего переписывать данные в его модели вычислений. ;)