Spec-Zone.ru › Haskell 9

System.Timeout

Авторские права (c) The University of Glasgow 2007
Лицензия В стиле BSD (см. файл libraries/base/LICENSE)
Сопровождающий libraries@haskell.org
Стабильность стабильный
Переносимость непереносимый
Безопасный Haskell Доверенный
Язык Haskell2010

Описание

Привязать событие тайм-аута к произвольным вычислениям IO.

data Timeout Источник

Исключение, выбрасываемое в поток функцией timeout для прерывания вычисления, превысившего время ожидания.

Начиная с: base-4.0

Экземпляры
Подробности экземпляров
Eq Timeout Источник
Подробности экземпляра

Определён в System.Timeout

Методы

(==) :: Timeout -> Timeout -> Bool Источник

(/=) :: Timeout -> Timeout -> Bool Источник

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

Подробности экземпляра

Определён в System.Timeout

Методы

showsPrec :: Int -> Timeout -> ShowS Источник

show :: Timeout -> String Источник

showList :: [Timeout] -> ShowS Источник

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API