python zeromq 使用


Reference: http://blog.csdn.net/kwsy2008/article/details/49464663

本篇博客將介紹zmq應答模式,所謂應答模式,就是一問一答,規則有這么幾條

        1、 必須先提問,后回答

        2、 對於一個提問,只能回答一次

        3、 在沒有收到回答前不能再次提問

 

        上代碼,服務端:

 

[python]  view plain  copy
 
  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2015-10-10 
  4. 回復請求 
  5. @author: kwsy2015 
  6. '''  
  7. import zmq  
  8. import time  
  9.   
  10. context = zmq.Context()  
  11. socket = context.socket(zmq.REP)  
  12. socket.bind('tcp://*:5555')  
  13.   
  14. while True:  
  15.     message = socket.recv()  
  16.     print 'received request: ' ,message  
  17.       
  18.     time.sleep(1)  
  19.     socket.send('World')  


        客戶端:

 

 

[python]  view plain  copy
 
  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2015-10-10 
  4. 你無法連續向服務器發送數據,必須發送一次,接收一次 
  5. REQ和REP模式中,客戶端必須先發起請求 
  6. @author: kwsy2015 
  7. '''  
  8. import zmq  
  9.   
  10. context = zmq.Context()  
  11. print 'connect to hello world server'  
  12. socket =  context.socket(zmq.REQ)  
  13. socket.connect('tcp://localhost:5555')  
  14.   
  15. for request in range(1,10):  
  16.     print 'send ',request,'...'  
  17.     socket.send('hello')  
  18.     message = socket.recv()  
  19.     print 'received reply ',request,'[',message,']'  


        為了滿足條件1,所以,客戶端必須先接收問題,客戶端總是必須先提問,客戶端提問后,必須等待回答,在收到回答前如果又發出提問,那么會報錯。

 

        zmq.REP是應答方,zmq.REQ是提問方,顯然,我們可以有多個提問方,但只能有一個提問方,這就好比正在學生正在上課,只能有一個老師來回答問題,可以有多個學生提問,老師只能一個問題一個問題的來回答,所以嘍,必須是學生先提問,老師來回答,然后回答下一個學生的提問。

 

       自問自答環節:

       問題1: 應答方和提問方誰先啟動呢?(服務端和客戶端誰先啟動呢?)

            答: 誰先啟動都可以,和pub/sub模式一樣

       問題2: 如果服務端斷掉或者客戶端斷掉會產生怎樣的影響?

            答:  如果是客戶端斷掉,對服務端沒有任何影響,如果客戶端隨后又重新啟動,那么兩方繼續一問一答,但是如果是服務端斷掉了,就可能會產生一些問題,這要看服務端是在什么情況下斷掉的,如果服務端收是在回答完問題后斷掉的,那么沒影響,重啟服務端后,雙發繼續一問一答,但如果服務端是在收到問題后斷掉了,還沒來得及回答問題,這就有問題了,那個提問的客戶端遲遲得不到答案,就會一直等待答案,因此不會再發送新的提問,服務端重啟后,客戶端遲遲不發問題,所以也就一直等待提問。

       問題3: 看代碼,服務端根本就沒去區分提問者是誰,如果有兩個提問題的人,如何保證服務端的答案准確的發給那個提問的客戶端呢?

            答:  關於這一點,大家不必擔心,zmq的內部機制已經做了保證,提問者必然只收到屬於自己的答案,我們不必去操心zmq是怎么做到的,你只需關於業務本身即可。

             現在,我們把服務端代碼做修改

      

[python]  view plain  copy
 
  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2015-10-15 
  4.  
  5. @author: kwsy2015 
  6. '''  
  7. import zmq  
  8. import time  
  9.   
  10. context = zmq.Context()  
  11. socket = context.socket(zmq.REP)  
  12. socket.bind('tcp://*:5555')  
  13.   
  14. while True:  
  15.     message = socket.recv()  
  16.     print 'received request: ' ,message  
  17.     time.sleep(1)  
  18.     if message == 'hello':  
  19.         socket.send('World')  
  20.     else:  
  21.         socket.send('success')  

           寫兩個客戶端

 

           客戶端1:

[python]  view plain  copy
 
  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2015-10-15 
  4.  
  5. @author: kwsy2015 
  6. '''  
  7. import zmq  
  8.   
  9. context = zmq.Context()  
  10. print 'connect to hello world server'  
  11. socket =  context.socket(zmq.REQ)  
  12. socket.connect('tcp://localhost:5555')  
  13.   
  14. for request in range(1,10):  
  15.     print 'send ',request,'...'  
  16.     socket.send('hello')  
  17.     message = socket.recv()  
  18.     print 'received reply ',request,'[',message,']'  

            客戶端2:

 

 

[python]  view plain  copy
 
  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2015-10-15 
  4.  
  5. @author: kwsy2015 
  6. '''  
  7. import zmq  
  8.   
  9. context = zmq.Context()  
  10. print 'connect to hello world server'  
  11. socket =  context.socket(zmq.REQ)  
  12. socket.connect('tcp://localhost:5555')  
  13.   
  14. for request in range(1,10):  
  15.     print 'send ',request,'...'  
  16.     socket.send('ok')  
  17.     message = socket.recv()  
  18.     print 'received reply ',request,'[',message,']'  


          實際的運行結果如圖:

 

             不難看出,每個客戶端都收到了只屬於自己的答案

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM