Haskell параллелизм над Kqueue

Я написал параллельное приложение и поймал ошибку:

buildFdSets: дескриптор файла вне диапазона

Я обнаружил, что это ограничение ОС на количество файловых дескрипторов в одном процессе, в моем FreeBSD это 1024, Это предел select(), Также я узнал, что есть другой подход: kqueue(),

Мои вопросы:

  • Как выиграть лимит на файловые дескрипторы?
  • Как пользоваться kqueue() вместо select() в программах на Haskell?

2 ответа

Решение

Я считаю, что в GHC 7 теперь есть поддержка использования kqueue() в его бэкэнде:

ссылка на статью, описательный пост в блоге

Однако платформа Haskell еще не выпущена для GHC 7.

Вы можете просто обновить GHC 7, который является частью платформы Haskell, которая включает в себя:

На платформах POSIX существует новый менеджер ввода-вывода, основанный на epoll/kqueue/poll, который позволяет многопоточному коду ввода-вывода масштабироваться до гораздо большего числа (более 100 тыс.) Потоков

Особенно:

Архитектурно наш новый менеджер ввода / вывода состоит из двух компонентов. Наша библиотека уведомлений о событиях предоставляет чистый и переносимый API и абстрагирует механизмы системного уровня, используемые для предоставления эффективных уведомлений о событиях (kqueue, epoll и poll). Мы также написали оболочку, которая реализует полупубличные интерфейсы threadWaitRead и threadWaitWrite. Это означает, что ни базовые файловые, ни сетевые библиотеки, ни другие низкоуровневые библиотеки ввода-вывода не требуют каких-либо изменений для работы с нашим новым кодом и не извлекают из него никаких преимуществ в плане повышения производительности.

То есть просто обновляйся, и все работает волшебным образом.

Вот некоторые материалы для чтения:

Другие вопросы по тегам