2012-02-09 174 views
0
NexusConnectedClients = [] 

class Thread1(NexusCore.Thread): 
    def Run(): 
     global NexusConnectedClients 
     if(IncomingCommand == "ADDCLIENT"): 
      NewClientOBJ = [ 
       LastCID, 
       ClientType, 
       ClientADDR, 
       ClientObject, 
       Args[1], 
       Args[2], 
       '{"events":[]}' 
      ] 
      NexusConnectedClients.append(NewClientOBJ) 
     elif(IncomingCommand == "LISTCLIENTS"): 
      SendResponse(NexusConnectedClients) 

當我添加一個客戶端時,它是可以的。當我讀取NexusConnectedClients變量時,它被添加到列表中。 但是,當我運行LISTCLIENTS函數,列表是空的。哪裏不對?python全局變量未保存全局

我簡化了一下代碼。所有的變量都被設置好了,所有其他的全局變量都能正常工作。

編輯 我發現了錯誤,沒有錯代碼,但另一個函數從NexusConnectedClients陣列中刪除元素

+0

如果你已經解決了這個問題,請回答並接受你自己的答案,這樣可以標記爲已解決 – 2012-02-13 19:23:11

回答

0

解決了這個問題。未從先前的測試中移除一行代碼。該行重置陣列

0

你並不需要聲明NexusConnectedClients全球,因爲它在run方法可見。當您想要(重新)綁定全局範圍中的名稱時,變量必須聲明爲全局變量。當一個變量是可修改的,列表是,只需修改它。

取而代之的是你需要做的是規範對NexusConnectedClients的訪問。您正在修改線程內的共享變量,可能不止一個。使用鎖。說,我認爲在這樣一個小片段中沒有更多可以說的了。

+0

試過了,沒有解決問題。這很奇怪。有時它確實保存了元素。有時候不是。很奇怪。但其中一個客戶端應用程序總是按照它應該的那樣工作,而另一些則不是。 – alpjef 2012-02-12 18:24:02

+0

@alpjef:代碼太短而無法調查問題。變量「IncomingCommand」,「Args」等來自哪裏?他們是由某個線程管理的嗎?對於我所看到的,SendResponse可以做這樣的事情:'NexusConnectedClients [:] = []'。看看http://sscce.org/,最重要的是,它應該是獨立的。 – 2012-02-13 09:52:24