System.Timeout
| Авторские права | (c) Университет Глазго 2007 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | экспериментальная |
| Переносимость | непереносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
Прикрепить событие таймаута к произвольным IO вычислениям.
Исключение, сбрасываемое в поток timeout для прерывания вычисления, истекшего по таймауту.
С момента: base-4.0
Примеры
| Eq Timeout | |
| Show Timeout | С момента: base-4.0 |
| Исключение 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