2014-01-29 45 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

相關問題