Вопрос

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

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

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

Мои вопросы:

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

Решение

Я считаю, что GHC 7 теперь поддерживает использование KQueue () в задней части:

Ссылка на бумагу, Описательный блог Post.

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

Другие советы

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

На платформах POSIX есть новый менеджер ввода / вывода, основанный на EPOLL / KQUEUE / POLL, который позволяет многопотативному ввода-выводу в масштабе к гораздо большему количеству (100K +) потоков

Особенно:

Архитектурно, наш новый I / O Manager состоит из двух компонентов. Наше мероприятие Noti-Fiation Library предоставляет чистые и портативные API, а также тезисы. Механизмы уровня системы, используемые для обеспечения эффективных событий (KQueue, Epoll и опроса). Мы также написали прокладку, который реализует полутелые интерфейсы ThreadWaitRead и Threadwaitwaitwaitwaitwaitwaitwait. Это означает, что ни библиотеки основных файлов или сетевых библиотек, а также другие библиотеки ввода / вывода низкого уровня, требуют никаких изменений в работе с и прозрачно выгодно от улучшений производительности нашего нового кода.

То есть просто обновление, и все работает волшебно лучше.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top