2014-01-29 32 views
0

ZeroMQ指南指出套接字不应该在线程之间共享。将ZeroMQ套接字移至另一个线程

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插座,然后再使用:然而,在Pyre ZeroMQ项目,在zhelper模块中的一些点套接字在一个线程,然后在一个新的线程用于创建它在另一个线程中是否创建者线程实际上没有调用任何套接字函数?

+0

如果跨线程共享,会导致锁定/问题。但从技术上讲这是可能的。我会反对它的建议,但如果你有自己的头,它应该是可以使其工作。 – Torxed

+0

只是出于好奇,在新线程中创建套接字的含义是什么? – Turion

+0

没什么,这是我在自己的代码中所做的。但是,这个例子是来自官方ZeroMQ项目的样本。这就是为什么我在这里有点困惑,因为它似乎没有遵循通常的建议。 – Charles

回答

1

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

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

+0

我同意。此外,指南提到(对不起,我无法找到确切的链接)Context是线程安全的,但套接字不是。正如你所说,最好使用'inproc://'目标在进程之间进行通信。它也有助于你的可伸缩性,这是一个完整的点。 :) – terminus

相关问题