超时时如何重试阻塞IO Action?
How to retry blocking IO Action when timeout?
如何处理 Haskell 中的阻塞 IO
操作?我怎样才能把这个 IO
动作放在一个范围内并从另一个方法管理这个范围?如果达到超时,我将重新调用此方法。通常在其他语言中,如果我没有在可配置的时间内得到结果,我可能会把它放在一个单独的线程中 abort
。 (定时器是外部的。)
在我的例子中:我有一些 retries
并且假设我想执行一个超时的 IO
操作。当且仅当 retries
的数量大于 0.
时,我如何将 IO
操作放在超时范围内,以便在超时到期后被召回
基本上:给定我们的 IO
动作,例如 ioMethod::IO String
(我还没有在套接字库中查找 Haskell),我们假设它是一个黑盒子,
module Retry where
import IOExternal(ioMethod)
retryFunc :: Int -> IO String
retryFunc retries=do
msg<-retry 5 100 IOExternal
return msg
retry :: Int -> Int -> IOExternal -> IO String
retry retries timeout ioMethod = go retries timeout "" where
go 0 timeout ioMethod msg =
if msg=="" then return "Max Retries reached"
else return msg
go retries timeout ioMethod msg counter
= gogo retries timeout counter msg where
gogo retries timeout 0 msg = return ""
gogo retries timeout counter msg
= ioMethod>>=gogo retries timeout counter-1
最后这个我不知道怎么建模condition/line。
P.S 我还不熟悉 Haskell 中的线程(这里是初学者),我确实认为超时作用域应该在不同的线程,不知何故我需要从我的主程序中检查它,然后调用它(如果重试> 0)或结束主要方法。
您可以使用 timeout 为任何阻塞调用添加超时,并为重试添加简单的递归:
retry :: Int -> Int -> IO a -> IO (Maybe a)
retry 0 _ _ = return Nothing
retry numRetries microseconds action = do
result <- timeout microseconds action
case result of
Nothing -> retry (numRetries-1) microseconds action
Just a -> return (Just a)
尽管如此,请务必阅读有关 FFI 内容的注意事项的文档。
如何处理 Haskell 中的阻塞 IO
操作?我怎样才能把这个 IO
动作放在一个范围内并从另一个方法管理这个范围?如果达到超时,我将重新调用此方法。通常在其他语言中,如果我没有在可配置的时间内得到结果,我可能会把它放在一个单独的线程中 abort
。 (定时器是外部的。)
在我的例子中:我有一些 retries
并且假设我想执行一个超时的 IO
操作。当且仅当 retries
的数量大于 0.
IO
操作放在超时范围内,以便在超时到期后被召回
基本上:给定我们的 IO
动作,例如 ioMethod::IO String
(我还没有在套接字库中查找 Haskell),我们假设它是一个黑盒子,
module Retry where
import IOExternal(ioMethod)
retryFunc :: Int -> IO String
retryFunc retries=do
msg<-retry 5 100 IOExternal
return msg
retry :: Int -> Int -> IOExternal -> IO String
retry retries timeout ioMethod = go retries timeout "" where
go 0 timeout ioMethod msg =
if msg=="" then return "Max Retries reached"
else return msg
go retries timeout ioMethod msg counter
= gogo retries timeout counter msg where
gogo retries timeout 0 msg = return ""
gogo retries timeout counter msg
= ioMethod>>=gogo retries timeout counter-1
最后这个我不知道怎么建模condition/line。
P.S 我还不熟悉 Haskell 中的线程(这里是初学者),我确实认为超时作用域应该在不同的线程,不知何故我需要从我的主程序中检查它,然后调用它(如果重试> 0)或结束主要方法。
您可以使用 timeout 为任何阻塞调用添加超时,并为重试添加简单的递归:
retry :: Int -> Int -> IO a -> IO (Maybe a)
retry 0 _ _ = return Nothing
retry numRetries microseconds action = do
result <- timeout microseconds action
case result of
Nothing -> retry (numRetries-1) microseconds action
Just a -> return (Just a)
尽管如此,请务必阅读有关 FFI 内容的注意事项的文档。