2017-05-25 30 views
0

我已成立等Python的進程字典發送超過插座

manager = Manager(); 

nodes = manager.dict(); 

p1 = Process(target = advertise, args=(nodes,)); 
p1.start(); 
p2 = Process(target = receive, args=(nodes,)); 
p2.start(); 

def advertise(nodes): 
    while(1): 
     nts = json.dumps(nodes.copy()); 
     for k, v in nodes.items(): 
      # Creates a UDP socket 
      mySocket = createSocket(getMyIP(), PORT); 
      mySocket.connect((getMyIP(), v[1])); 
      mySocket.send(("AD||" + nts).encode("ASCII")); 
      mySocket.close(); 
     time.sleep(5); 

def receive(nodes): 
    while(1): 
     mySocket = createSocket(getMyIP(), PORT); 
     mySocket.bind((getMyIP(), PORT)); 
     try: 
      data = mySocket.recv(4096).decode("ASCII").split("||"); 
      if(data[0] == "AD"): 
       temp = json.loads(data[1]); 
       #print("Received: " + str(temp)); 
      for k, v in temp.items(): 
       nodes[k] = [float(v[0]), int(v[1])]; 
     except: 
      mySocket.close(); 

其中之一接收一個字典和更新值,其中之一發出一個字典的過程。 我不能json.dumps(節點),因爲它說DictProxy不是jsondumpable,所以我做了nts = json.dumps(nodes.copy());

這適用於第一次(插座正確地發送字典),但第二次的方案只是說

File "Dvr.py", line 40, in advertise 
    nts = json.dumps(nodes.copy()); 
File "<string>", line 2, in copy 
File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod 
    conn.send((self._id, methodname, args, kwds)) 
IOError: [Errno 32] Broken pipe 

1)爲什麼這只是首次while循環迴路工作?

2)我該如何讓它每次工作?

+0

我不知道,因爲我不不知道你用於套接字連接的庫是什麼,但它可能是(在第二次迭代中),你將一個套接字連接到已經打開的IP和PORT連接(不允許使用庫'socket') –

回答

0

固定 我只是用線程的流程,以便更容易擁有,而不必共享跨多個進程字典爲全局簡單的字典,而不是存儲空間