2017-04-25 44 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