Реализация блокировки очереди в Haskell - PullRequest
5 голосов
/ 12 февраля 2012

В java есть хороший пакет java.util.concurrent, который содержит реализацию интерфейса BlockingQueue.

Мне нужно что-то похожее в Haskell, поэтому оно сможет

  • поддерживать фиксированный размер очереди в памяти
  • блокировать операции чтения, когда очередь пуста (получить)
  • предоставляет блоки в формате time-box, которые возвращают Nothing, если очередь пуста и превышено время ожидания
  • аналогично операциям put - блокировка, пока очередь не будет заполнена в версии с временным форматом

возможно, это можно реализовать с помощью STM или блокирования транзакций - но я не смог найти что-то подобное в хакерских атаках.

Ответы [ 3 ]

7 голосов
/ 12 февраля 2012

Параллельная очередь часто называется Chan (каналом) в Haskell, и, как вы можете ожидать, действительно существует пакет BoundedChan в Hackage , который выглядит так, как будто он соответствует вашим потребностям, за исключением тайм-ауты. Однако вы должны быть в состоянии получить это с помощью System.Timeout .

3 голосов
/ 12 февраля 2012

Пакет stm-chans содержит широкий спектр каналов для STM. Похоже, что он поддерживается более активно, чем упомянутый хаммар пакетов BoundedChan (который последний раз обновлялся в 2009 году), и благодаря использованию STM он будет безопасен для исключений.

Я считаю, что его вариант TBChan в сочетании с System.Timeout соответствует всем вашим требованиям.

3 голосов
/ 12 февраля 2012

Мне нужно дать небольшое предупреждение.Источник BoundedChan показывает, что это не исключение безопасно.Если вы знаете, что вы свободны от исключений, например, избегаете killThread, тогда все будет в порядке.Если вам нужна пуленепробиваемая библиотека, вам нужно улучшить BoundedChan .Безопасная библиотека исключений будет использовать withMVar или bracket вместо takeMVar и putMVar.

Использование STM позволит избежать большинства проблем безопасности исключений, и это может быть составлено с System.Timeout .Кроме того, тайм-аут был обернут несколькими способами на Hackage .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...