2017-04-25 80 views
0

我寫了一個代碼,其中任何數量的客戶端將發送請求到服務器。服務器將收集他們的信息到一個單一的字典,並將回覆這些客戶端的回覆。Python套接字與多線程同步問題

我迄今所做的是:

  1. 服務器將偵聽連接。
  2. 爲每個新連接接受,它將創建一個新線程
  3. 在每個線程中收到一條消息並將信息存儲在字典中。
  4. 然後,服務器將發回字典中值的回覆數。

由於字典必須在所有線程之間共享,因此客戶端將接收的值的數量應該相同。

我面臨的錯誤是字典沒有以共享的方式訪問。我知道我面對的是種族的狀況。 我試過使用鎖,RLocks甚至條件變量,但它不工作。

請幫助如何去做。

爲)做了以下主題我繼承Thread類,並覆蓋了運行(:

[僞]

def run(self): 
    data = sock.recv(1024) 
    dc["vals"].append(data) 
    # dc is shared dictionary and values are list 
    dr = self.processStrings(dc) #need to access all values after updates from all threads 
    sock.sendall(dr) #this has to be sent to different individual clients back 
+0

你可以請共享可執行代碼,這不合格 –

+0

我可能無法發佈可執行代碼,因爲它會通過剽竊檢測器進行檢查。所以可能會導致分配不合格。 –

+0

拋開競爭條件,您爲什麼期望爲所有客戶提供相同的價值?我希望每個新客戶都會增加一個元素的字典,這將導致更高的數字被返回。否則,您如何知道所有客戶是否已連接,並且您準備好做出響應? – JohanL

回答

0

檢查了這一點:

import time 
import threading 

data = { 
    'key': [] 
} 


class Thread(threading.Thread): 

    def __init__(self, index): 
     super(Thread, self).__init__() 
     self.index = index 

    def run(self): 
     time.sleep(0.01) 
     data['key'].append(self.index) 


if __name__ == '__main__': 
    for i in range(10): 
     t = Thread(i) 
     t.start() 
     t.join() 

你怎麼叫thread.join啓動線程時?

+0

't.join()'做了什麼 –

+0

@SakshamKumar thread.join()表示在退出之前,MainThread應該等待ChildThread完成執行。 – gushitong