Spec-Zone.ru › Haskell 8

System.Timeout

Авторские права (c) Университет Глазго 2007
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддержка libraries@haskell.org
Стабильность экспериментальная
Переносимость непереносимая
Safe Haskell Безопасный
Язык Haskell2010

Описание

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

data Timeout Source

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

С момента: base-4.0

Примеры
Подробности примеров
Eq Timeout
Подробности примера

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

Методы

(==) :: Timeout -> Timeout -> Bool Source

(/=) :: Timeout -> Timeout -> Bool Source

Show Timeout

С момента: base-4.0

Подробности примера

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

Методы

showsPrec :: Int -> Timeout -> ShowS Source

show :: Timeout -> String Source

showList :: [Timeout] -> ShowS Source

Исключение Timeout

С момента: base-4.7.0.0

Подробности примера

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

Методы

toException :: Timeout -> SomeException Source

fromException :: SomeException -> Maybe Timeout Source

displayException :: Timeout -> String Source

timeout :: Int -> IO a -> IO (Maybe a) Source

Оборачивание IO вычисления, чтобы оно истекло по таймауту и возвращало Nothing, если результат недоступен в течение n микросекунд (1/10^6 секунд). В случае, если результат доступен до истечения таймаута, возвращается Just a. Отрицательный интервал таймаута означает "ждать неопределенно". При указании больших таймаутов будьте внимательны, чтобы не превысить maxBound :: Int.

>>> 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/8.10.2/docs/html/libraries/base-4.14.1.0/System-Timeout.html

Spec-Zone.ru

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