线程中未封闭的ZeroMQ套接字

mn

如果进程线程打开inprocZMQ套接字,然后由于某些未处理的异常而死亡,那么如果未关闭该套接字会发生什么?这种做法有多糟糕?

更具体地说,我实现了一个非常简单的消息代理,该消息代理与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"
mn

因此,如果您不关闭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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R中的ZeroMQ,如何关闭套接字

来自分类Dev

ZeroMQ REP套接字中的主题

来自分类Dev

创建线程zeromq套接字的正确方法是什么?

来自分类Dev

从线程中的Java TCP套接字读取

来自分类Dev

线程中的Python套接字接收

来自分类Dev

ZeroMQ:重新绑定套接字时,地址使用中错误

来自分类Dev

线程UDP套接字

来自分类Dev

从套接字流中读取时是否需要线程休眠?

来自分类Dev

通过线程中的套接字进行对象输入/输出

来自分类Dev

如何从flask socketio中的线程发射到某个套接字?

来自分类Dev

python中(多线程)套接字的列表/数组

来自分类Dev

从套接字流中读取的线程占用更多 CPU

来自分类Dev

了解高级ZeroMQ套接字类型

来自分类Dev

如何使用ZeroMQ实现多个套接字?

来自分类Dev

动态创建对等套接字 (ZeroMQ)

来自分类Dev

套接字和线程python

来自分类Dev

循环创建套接字/线程

来自分类Dev

套接字用于多线程?

来自分类Dev

套接字和线程python

来自分类Dev

循环创建套接字/线程

来自分类Dev

从主线程关闭套接字

来自分类Dev

如何在ZeroMQ套接字中检索和存储随机UUID?

来自分类Dev

ZeroMQ如何管理zmq :: proxy和zmq :: poll中的套接字?

来自分类Dev

未创建 Android 套接字

来自分类Dev

套接字未连接 Python

来自分类Dev

Python-多线程套接字

来自分类Dev

从套接字AsyncCallback访问UI线程

来自分类Dev

带套接字的多线程文件传输

来自分类Dev

套接字发送/接收的单独线程?