System.Timeout
| Авторские права | (с) Университет Глазго 2007 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | экспериментальная |
| Переносимость | непереносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
Присоединить событие тайм-аута к произвольным IO вычислениям.
timeout :: Int -> IO a -> IO (Maybe a) Исходный код
Оборачивает IO вычисление, чтобы вызвать тайм-аут и вернуть Nothing в случае, если результат недоступен в течение n микросекунд (1/10^6 секунд). В случае, если результат доступен до истечения тайм-аута, возвращается Just a. Отрицательный интервал тайм-аута означает "ожидать неопределённо". При указании длинных тайм-аутов будьте внимательны, чтобы не превысить maxBound :: Int.
Разработка этого комбинатора была направлена на то, чтобы timeout n f вел себя точно так же, как f, пока f не истечёт время ожидания. Это означает, что у f будет тот же myThreadId, что и без обёртки тайм-аута. Любые исключения f могут прервать тайм-аут и распространиться дальше. Также возможно, что f получит исключения, брошенные другой нитью.
Тонкий момент реализации — вопрос о том, как прервать IO вычисление. Этот комбинатор полагается на асинхронные исключения внутри. Этот метод отлично работает для вычислений, выполняемых внутри системы выполнения Haskell, но не работает для кода, не написанного на Haskell. Например, вызовы внешних функций не могут быть ограничены по времени с помощью этого комбинатора просто потому, что произвольная функция C не может получать асинхронные исключения. Если timeout используется для обёртки вызова FFI, который блокирует выполнение, событие тайм-аута не может быть доставлено до тех пор, пока вызов FFI не вернётся, что практически сводит на нет смысл комбинатора. Однако на практике это ограничение менее серьёзно, чем кажется. Стандартные функции ввода-вывода, такие как hGetBuf, hPutBuf, Network.Socket.accept или hWaitForInput, кажутся блокирующими, но на самом деле они таковыми не являются, так как система выполнения использует механизмы планирования, такие как select(2), для выполнения асинхронного ввода-вывода, поэтому возможно прервать стандартный сокет или ввод-вывод файлов с помощью этого комбинатора.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/System-Timeout.html