将ZeroMQ套接字移动到另一个线程

时间:2014-01-29 14:13:55

标签: python multithreading networking thread-safety zeromq

ZeroMQ指南指出不应在线程之间共享套接字。但是,在Pyre ZeroMQ项目中,在zhelper模块中的某个时刻,在一个线程中创建一个套接字,然后在新线程中使用:

def zthread_fork(ctx, func, *args, **kwargs):
    """
    Create an attached thread. An attached thread gets a ctx and a PAIR
    pipe back to its parent. It must monitor its pipe, and exit if the
    pipe becomes unreadable. Returns pipe, or NULL if there was an error.
    """
    a = ctx.socket(zmq.PAIR)
    a.linger = 0
    b = ctx.socket(zmq.PAIR)
    b.linger = 0
    a.set_hwm(1)
    b.set_hwm(1)
    iface = "inproc://%s" % binascii.hexlify(os.urandom(8))
    a.bind(iface)
    b.connect(iface)

    thread = threading.Thread(target=func, args=((ctx, b)+args), kwargs=kwargs)
    #thread.daemon = True
    thread.start()

    return a

如果创建者线程实际上没有调用任何套接字函数,是否可以在线程中创建一个ZeroMQ套接字然后在另一个线程中使用它?

1 个答案:

答案 0 :(得分:1)

当您在其间放置内存屏障时,可以将套接字传递给另一个线程。锁和其他同步原语使用内存屏障,所以是的,你可以使用任何同步原语来包装你的套接字。

然而,我想指出的是,必须将套接字包装在互斥锁中通常会说您的架构出了问题。你应该做的是设置多个inproc套接字,每个线程拥有一个或多个套接字,并让线程通过这些inproc套接字相互通信,而不是使用互斥锁交换套接字。