2015-07-22 50 views
0

它可以分爲兩部分:一個線程用於創建實時每五分鐘一次,一旦它有新的數據,數據將被髮送到連接插座。如何每五分鐘向多個客戶端並行發送數據

套接字連接在主線程中建立並由每個生成線程處理。以下代碼給出了簡要說明,目的是每隔五分鐘將glb_data的值發送到所有這些連接的套接字。

import time 
from multiprocessing import Process 

class Climate(Object): 
    def update(self, glb_data): 
     while True: 
      time.sleep(5) 
      glb_data += 1 
def send_data(connection, glb_data): 
    xml_text = glb_data.encode() 
    xml_len = len(data) 
    connection.sendall(str(xml_len).encode() + b' ' +xml_text)  

if __name__ == "__main__": 
    glb_data = "" 
    cli_obj = Climate() 
    cli = Process(name="climate_data", target=cli_obj.update_data, args=(glb_data,)) 
    cli.start() 

    sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sockobj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    print "run launchserver" 
    sockobj.bind((serverHost, eval(serverPort))) 
    sockobj.listen(5) 

    while True: 
     connection, address = sockobj.accept() 
     print('Server connected by', address) 
     handleclient = Process(name='handleclient', target=send_climate_data, args=(connection,glb_data)) 
     handleclient.start() 

的問題如下:

  1. 如何獲得所有socket連接,並調用SEND_DATA功能 在產卵線程中運行。就像觀察者模式一樣,它將是完美的。
  2. 如何確保每個線程都收到最新的glb_data。
+0

標題很奇怪,「實時數據」和「每五分鐘」似乎並不合適。 –

+0

@KlausD。也許有點奇怪,但「五分鐘」和「實時」之間沒有矛盾。實時只意味着您保證在指定的時間內完成 - 時間限制可能因應用程序而異。 – skyking

回答

0

爲了保證每個線程及時發送最新的glb_data,您必須知道發送數據從不需要五分鐘或更長時間,否則您將不得不應對這種情況。

基本上有兩種方法可以做到這一點。一種是爲每個套接字創建一個線程,讓主線程等待主線程的信號發送數據,另一個線程創建線程,一旦主線程決定發送數據。如果您知道發送數據將在下一個數據可用之前完成,或者可以在新數據可用時中止發送舊數據(取決於操作系統的行爲),但第二種解決方案最直接,如果您需要排隊數據如果舊數據沒有完成發送您可能會想要使用第一個解決方案。

由於第二種解決方案非常簡單,我選擇概述它。

def main_loop(): 
    while True: 
     data = generate_data() 
     if not data: 
      break 
     for s in sockproc: 
      if hasattr(sockproc, "process") and sockproc.process.is_alive(): 
        sockproc.process.terminate() 
      sockproc.process = Process(target = send_data, args=(sockproc.socket, data)) 
      sockproc.run() 
     sleep(300) 

其中sockproc是對象的數組具有初始屬性socket是有問題的插座 - 除了屬性process填充了相應的處理。函數send_data應該只在給定套接字上發送數據並返回。

請注意,我沒有測試代碼,因此可能有一些增強空間。

相關問題