System.Timeout
| Авторские права | (c) The University of Glasgow 2007 |
|---|---|
| Лицензия | В стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильный |
| Переносимость | непереносимый |
| Безопасный Haskell | Доверенный |
| Язык | Haskell2010 |
Описание
Привязать событие тайм-аута к произвольным вычислениям IO.
Исключение, выбрасываемое в поток функцией timeout для прерывания вычисления, превысившего время ожидания.
Начиная с: base-4.0
Экземпляры
| Eq Timeout Источник | |
| Exception Timeout Источник | Начиная с: base-4.7.0.0 |
Определён в System.Timeout МетодыtoException :: Timeout -> SomeException Источник fromException :: SomeException -> Maybe Timeout Источник displayException :: Timeout -> String Источник backtraceDesired :: Timeout -> Bool Источник | |
| Show Timeout Источник | Начиная с: base-4.0 |
timeout :: Int -> IO a -> IO (Maybe a) Источник
Обернуть вычисление IO так, чтобы оно завершилось по тайм-ауту и вернуло Nothing, если результат не будет получен в течение n микросекунд (1/10^6 секунд). Если результат будет получен до истечения времени ожидания, возвращается Just a. Отрицательный интервал тайм-аута означает «ждать бесконечно». При указании длительного времени ожидания будьте осторожны и не превышайте maxBound :: Int, которое на 32-разрядных машинах составляет всего 2147483647 мкс, то есть менее 36 минут. Рассмотрите возможность использования Control.Concurrent.Timeout.timeout из пакета unbounded-delays.
>>> timeout 1000000 (threadDelay 1000 *> pure "finished on time") Just "finished on time"
>>> timeout 10000 (threadDelay 100000 *> pure "finished on time") Nothing
При разработке этого комбинатора руководствовались целью обеспечить, чтобы timeout n f вёл себя точно так же, как f, если f не превысит время ожидания. Это означает, что f имеет те же myThreadId, что и без обёртки с тайм-аутом. Любые исключения, которые может выбросить f, отменяют тайм-аут и распространяются дальше вверх. Кроме того, f может получить исключения, выброшенные в него другим потоком.
Непростой аспект реализации — вопрос о том, как прервать вычисление IO. Этот комбинатор внутри использует асинхронные исключения (а именно, выбрасывает в вычисление исключение Timeout). Этот метод хорошо работает для вычислений, выполняющихся внутри среды выполнения 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/9.14.1/docs/libraries/base-4.22.0.0-66f8/System-Timeout.html