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套接字然后在另一个线程中使用它?
答案 0 :(得分:1)
当您在其间放置内存屏障时,可以将套接字传递给另一个线程。锁和其他同步原语使用内存屏障,所以是的,你可以使用任何同步原语来包装你的套接字。
然而,我想指出的是,必须将套接字包装在互斥锁中通常会说您的架构出了问题。你应该做的是设置多个inproc套接字,每个线程拥有一个或多个套接字,并让线程通过这些inproc套接字相互通信,而不是使用互斥锁交换套接字。