Haskell. Erlang-style process communication.

Apr 10, 2008 15:52

Посмотрев на реализацию Erlang-style Distributed Haskell захотелось нарисовать что-то своё, простое, для коммуникации процессов внутри одного исходника. Получился достаточно небольшой модуль:

Process.hs )

haskell, erlang

Leave a comment

rvp74 February 27 2009, 08:20:06 UTC
> За эрланговскими конструкциями receive ... end и receive ... after ... end не гнался.

Кстати, да. У Эрланга логика приема сильно отличается от простой очереди сообщений.

Reply

mibori February 27 2009, 09:24:55 UTC
Верно.
Логику, как у Эрланга можно реализовать самостоятельно:
1. Принять сообщение через recv, recvDelay, recvMaybe
2. Если сообщение не подошло, то вернуть его обратно в очередь через sendMe, sendMeBack

Reply

rvp74 February 27 2009, 11:00:17 UTC
Если возвращать в очередь сообщение то порядок его в очереди будет другой. А в Эрланге порядок насколько я помню важен.

Reply

mibori February 27 2009, 11:38:23 UTC
неа

sendMe плюхнет сообщение в очередь сверху (как обычно)
А sendMeBack -- плюхнет снизу, откуда оно было вытащено recv. sendMeBack для того и задумывалась, чтобы сохранять порядок в очереди, если нужно вытащить только определенное сообщение.

Reply

rvp74 February 27 2009, 11:53:39 UTC
прием в Эрланге не ограничивается анализом одного элемента. Он сканирует всю очередь и вытягивает из любого места.

Reply

mibori February 27 2009, 12:13:46 UTC
Ничего не мешает просканировать всю очередь.
Но да, мы упрёмся в производительность такого алгоритма.

Альтернативой этому мы можем создать несколько процессов с копиями одной очереди (через spawnDup). Сообщение посылаемое такому процессу будет появляться и в соседнем процессе тоже. При этом, удаление сообщения из своей очереди одного процесса не приведет к удалению сообщения из очереди другого. Один процесс будет обрабатывать сообщения одного вида и игнорировать сообщения другого, а второй процесс -- наоборот. При этом сообщения можно посылать любому из процессов.

Reply


Leave a comment

Up