如果进程线程打开inproc
ZMQ套接字,然后由于某些未处理的异常而死亡,那么如果未关闭该套接字会发生什么?这种做法有多糟糕?
更具体地说,我实现了一个非常简单的消息代理,该消息代理与Haskell中的http://zguide.zeromq.org/page:all#Multithreading-with-MQ非常相似。
工作线程打开一个新的套接字,并在无限循环中等待处理消息。套接字未在工作线程中的任何位置关闭。
现在,如果工作线程中存在未处理的异常,并且该线程死亡,那么仅在不关心的情况下重新启动线程有多糟糕?
我要粘贴Haskell示例中的工作程序代码:
worker :: ZMQ z ()
worker = do
receiver <- socket Rep
connect receiver "inproc://workers"
forever $ do
receive receiver >>= liftIO . printf "Received request:%s\n" . unpack
-- Suppose there is some exception here
liftIO $ threadDelay (1 * 1000 * 1000)
send receiver [] "World"
因此,如果您不关闭inproc
套接字,似乎重新启动的线程将无法很好地接受消息。我不确定我是否了解这种行为,但是我可以确认ZMQ haskell指南中的此修改示例是否有效:
import System.ZMQ3.Monadic
import Prelude hiding (catch)
import Control.Monad.CatchIO
worker :: ZMQ z ()
worker = do
liftIO $ putStrLn "Starting the worker thread..."
receiver <- socket Rep
connect receiver "inproc://workers"
catch
(forever $ do
liftIO $ putStrLn "Waiting for an inproc message"
request <- receiveMulti receiver -- request :: ByteString.Char8
liftIO $ putStrLn "I'm doing something that may throw an error"
-- error "IO Error has happened"
)
(\(e :: IOError) -> do
liftIO $ putStrLn $ "Caught error: " ++ (show e)
close receiver -- Commenting this out will result in the restarted worker thread being unable to accept new messages
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句