【问题标题】:Unclosed ZeroMQ sockets in threads线程中未关闭的 ZeroMQ 套接字
【发布时间】:2014-05-10 07:51:18
【问题描述】:

如果一个进程线程打开一个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"

【问题讨论】:

  • 查看 LINGER 标志。您可能还想查看 nanomsg。我认为它比 zeromq 有更好的默认值,例如,它将 LINGER 设置为 1 秒。
  • 啊,问题不在于 LINGER。我只是想了解未关闭的 inproc 套接字的影响,尤其是使用 Haskell 绑定。

标签: multithreading haskell zeromq


【解决方案1】:

所以看来如果不关闭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                                                                                               
                )   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2011-11-10
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2014-02-21
    相关资源
    最近更新 更多