2017-03-29 448 views
1

我是ZeroMQ的新手。我花了幾個月的時間閱讀文檔並在圖書館進行實驗。我目前正在開發一個多線程的C++應用程序,並希望使用ZeroMQ而不是互斥體在我的主線程和它的一個子線程之間交換數據。使用ZMQ進行雙向線程間通信

子線程正在處理與外部應用程序的通信。因此,我需要在主線程和它的子進程之間進行排隊/套接字。一個用於傳出消息,另一個用於傳入消息。

我應該使用哪個zmq套接字來實現此目的。

在此先感謝

+0

我能找到我的問題的答案。我需要使用ZMQ_PAIR套接字。您可以參考以下文檔:http://api.zeromq.org/4-2:zmq-socket –

回答

3

通過使用共享內存和互斥使用ZeroMQ移動,你正進入Actor模型編程的境界。

在我看來,這是一件相當好的事情。但是,有些事情需要注意。

  1. 不再需要互斥鎖的唯一原因是因爲您正在複製數據,而不是共享數據。 '成本'是複製大量數據需要比鎖定指向共享數據的互斥鎖更長的時間。所以你最終可以看到一個好看的Actor模型程序,它與使用共享內存/互斥體的等效程序相比,它像狗一樣運行。
  2. 需要注意的是,在諸如具有多個CPU的Intel Xeons等複雜體系結構中,訪問共享內存可以像複製它一樣長。這是因爲這可能(取決於你有多幸運)意味着整個QPI巴士的交易。演員模型編程非常適合NUMA硬件架構。現代英特爾和AMD架構部分/基本上是NUMA,但是他們通過QPI/Hypertransport運行的協議「僞造」了SMP環境。
  3. 我會盡可能避免使用ZMQ_PAIR套接字。他們不通過網絡連接工作。這意味着,如果出於任何原因,您的應用程序需要跨多臺計算機進行擴展,則必須重新編寫代碼。但是,如果您從一開始就使用不同的套接字類型,那麼擴展應用程序無非是重新部署代碼而不是改變它。 FYI nanomsg PAIRs沒有這個限制。
  4. 不要一時認爲Actor模型編程將解決您所有的問題。它帶來了一整套它自己的問題。你仍然可能發生死鎖,活鎖,螺旋鎖等等。Actor模型程序的問題在於,這些問題可能會潛伏在你的代碼中多年,並且永遠不會發生,直到有一天網絡稍微忙一點,並且--bam-你的程序停止運行...
  5. 但是,有一個名爲「溝通順序過程」的Actor模型編程的發展。這並不能解決這些問題,但如果您已經爲這些問題編寫了程序,那麼它們就會保證每一次都會發生。所以你在開發和測試期間發現問題,而不是五年後。還有一個過程演算,也就是說,在你編寫一行代碼之前,你可以用代數的方式證明你的設計沒有問題。 ZeroMQ不是CSP。有趣的是,CSP正在使東西捲土重來 - Rust和Go語言都做CSP。但是,他們不通過網絡連接進行CSP - 這都是在進程中的東西。 Erlang也是CSP,AFAIK通過網絡連接來完成它。
  6. 假設您已經閱讀了有關CSP的所有內容,並且仍將使用ZeroMQ,請仔細考慮您計劃通過ZeroMQ套接字發送的內容。如果它全部在同一臺機器上的一個程序中,那麼發送例如整數數組的副本就沒有問題。在接收端它們仍然可以被解釋爲整數。但是,如果您希望通過ZMQ套接字將數據發送到另一臺計算機,那麼非常值得考慮某種序列化技術。 ZeroMQ提供消息。爲什麼不讓這些消息成爲對象序列化程序的字節流?那麼你可以保證接收到的信息在反序列化後意味着在接收端是合適的,而不必解決排序問題等。
  7. 我最喜歡的serialisers包括Google Protocol Buffers。它是語言/操作系統不可知論者,爲異構系統提供了許多選擇。 ASN.1是另一個非常好的選擇,它可以用於大多數重要的語言,並且它有一組豐富的連線格式(包括XML和現在/很快的JSON,它提供了一些有趣的內部操作選項),並做約束(谷歌PBufs不這樣做),但如果一個人想要真正好的工具,往往會花錢。幾乎任何東西都可以理解XML,但是臃腫。基本上值得選擇一個不牽絆於使用C#或Python的地方。

祝你好運!

+0

像往常一樣,@bazza是每個分佈式計算架構師必須牢記的設計方面的完美清單。 **優秀的工作!** – user3666197

+0

感謝您的詳細解答。我將更多地閱讀CSP,看看它是否能改進我的架構。 –