Посмотрев на реализацию Erlang-style Distributed Haskell захотелось нарисовать что-то своё, простое, для коммуникации процессов внутри одного исходника. Получился достаточно небольшой модуль:
Неделю медитировал над твоим кодом, хотел взять для одной штуковины как есть - уж очень всё красивое. Сегодня просветлился, сделаю чуть по-другому. Спасибо!
Штуковина такая: отлаживаю одну хреновину, которая лазает по HTTP, сеть тормозная дико - анлим, что с него взять. Поэтому хочу повесить тред, который будет сетевые запросы гонять, и швырять в него функциями, которые в сеть лазают. А сам параллельно висеть в GHCi. По-другому сделаю потому что мне не нужен полноценный Эрланг, стандартного Chan должно хватить для всего. Просто пару недель назад я не знал о существовании такой библиотеки. А нормально запустить параллельность ещё и сегодня не получается. :)
А нормально запустить параллельность ещё и сегодня не получается. А у тебя те треды, которые собственно коннектятся, через forkOS пускаются? (иначе у тебя каждый foreign unsafe-вызов (считай, коннект к серваку) будет блокировать все другие треды).
Верно. Логику, как у Эрланга можно реализовать самостоятельно: 1. Принять сообщение через recv, recvDelay, recvMaybe 2. Если сообщение не подошло, то вернуть его обратно в очередь через sendMe, sendMeBack
sendMe плюхнет сообщение в очередь сверху (как обычно) А sendMeBack -- плюхнет снизу, откуда оно было вытащено recv. sendMeBack для того и задумывалась, чтобы сохранять порядок в очереди, если нужно вытащить только определенное сообщение.
Comments 31
(The comment has been removed)
см. примеры на http://community.livejournal.com/ru_lambda/81733.html
Reply
http://shootout.alioth.debian.org/gp4/benchmark.php?test=threadring&lang=all
http://shootout.alioth.debian.org/gp4/benchmark.php?test=chameneosredux&lang=all
Reply
(The comment has been removed)
(The comment has been removed)
убьёшь, если вдруг стану много не по теме постить.
Reply
Reply
а что за штуковина, если не секрет (просто интересно ввиду малого количества показательных примеров)
сделаю чуть по-другому
wow, что я упустил? :)
Reply
По-другому сделаю потому что мне не нужен полноценный Эрланг, стандартного Chan должно хватить для всего. Просто пару недель назад я не знал о существовании такой библиотеки. А нормально запустить параллельность ещё и сегодня не получается. :)
Reply
А у тебя те треды, которые собственно коннектятся, через forkOS пускаются? (иначе у тебя каждый foreign unsafe-вызов (считай, коннект к серваку) будет блокировать все другие треды).
Reply
Кстати, да. У Эрланга логика приема сильно отличается от простой очереди сообщений.
Reply
Логику, как у Эрланга можно реализовать самостоятельно:
1. Принять сообщение через recv, recvDelay, recvMaybe
2. Если сообщение не подошло, то вернуть его обратно в очередь через sendMe, sendMeBack
Reply
Reply
sendMe плюхнет сообщение в очередь сверху (как обычно)
А sendMeBack -- плюхнет снизу, откуда оно было вытащено recv. sendMeBack для того и задумывалась, чтобы сохранять порядок в очереди, если нужно вытащить только определенное сообщение.
Reply
Leave a comment