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. Это означает, что ни базовые файловые, ни сетевые библиотеки, ни другие низкоуровневые библиотеки ввода-вывода не требуют каких-либо изменений для работы с нашим новым кодом и не извлекают из него никаких преимуществ в плане повышения производительности.
То есть просто обновляйся, и все работает волшебным образом.
Вот некоторые материалы для чтения: