Посмотрев на реализацию Erlang-style Distributed Haskell захотелось нарисовать что-то своё, простое, для коммуникации процессов внутри одного исходника. Получился достаточно небольшой модуль:
Верно. Логику, как у Эрланга можно реализовать самостоятельно: 1. Принять сообщение через recv, recvDelay, recvMaybe 2. Если сообщение не подошло, то вернуть его обратно в очередь через sendMe, sendMeBack
sendMe плюхнет сообщение в очередь сверху (как обычно) А sendMeBack -- плюхнет снизу, откуда оно было вытащено recv. sendMeBack для того и задумывалась, чтобы сохранять порядок в очереди, если нужно вытащить только определенное сообщение.
Ничего не мешает просканировать всю очередь. Но да, мы упрёмся в производительность такого алгоритма.
Альтернативой этому мы можем создать несколько процессов с копиями одной очереди (через spawnDup). Сообщение посылаемое такому процессу будет появляться и в соседнем процессе тоже. При этом, удаление сообщения из своей очереди одного процесса не приведет к удалению сообщения из очереди другого. Один процесс будет обрабатывать сообщения одного вида и игнорировать сообщения другого, а второй процесс -- наоборот. При этом сообщения можно посылать любому из процессов.
Кстати, да. У Эрланга логика приема сильно отличается от простой очереди сообщений.
Reply
Логику, как у Эрланга можно реализовать самостоятельно:
1. Принять сообщение через recv, recvDelay, recvMaybe
2. Если сообщение не подошло, то вернуть его обратно в очередь через sendMe, sendMeBack
Reply
Reply
sendMe плюхнет сообщение в очередь сверху (как обычно)
А sendMeBack -- плюхнет снизу, откуда оно было вытащено recv. sendMeBack для того и задумывалась, чтобы сохранять порядок в очереди, если нужно вытащить только определенное сообщение.
Reply
Reply
Но да, мы упрёмся в производительность такого алгоритма.
Альтернативой этому мы можем создать несколько процессов с копиями одной очереди (через spawnDup). Сообщение посылаемое такому процессу будет появляться и в соседнем процессе тоже. При этом, удаление сообщения из своей очереди одного процесса не приведет к удалению сообщения из очереди другого. Один процесс будет обрабатывать сообщения одного вида и игнорировать сообщения другого, а второй процесс -- наоборот. При этом сообщения можно посылать любому из процессов.
Reply
Leave a comment