2013-03-20 86 views
0

我有一個與扭曲的Python併發訪問列表的問題。 我有一個扭曲的類,它將數據添加到列表中,並且每4秒調用一次該方法。這個方法是列表的元素並且執行一些操作。 我擔心從ossPeriodic和從dataReceived訪問相同的列表都可能導致一致性問題。 這裏是代碼:扭曲和python列表併發訪問

ossStorage=[] 

def ossPeriodic(): 
for i in ossStorage: 
      ossStorage.remove(i) 
    db.insertDataToDb(i) 
reactor.callLater(4, ossPeriodic) 

class OSS(Protocol): 
    def dataReceived(self, data): 
     account = pickle.loads(data)   
     ossStorage.append(account) 



def main(): 
    ossFactory = Factory() 
    ossFactory.protocol = OSS 
    reactor.listenTCP(50000, ossFactory)  
    reactor.callLater(4, ossPeriodic) 
    reactor.run() 

我應該使用鎖或類似的東西嗎? 謝謝!

+0

也許使用隊列應該有幫助嗎? – asdf 2013-03-20 22:01:49

回答

3

你使用線程嗎?如果沒有,那麼你沒有併發訪問列表。

通常,使用Twisted的應用程序不使用線程。 Twisted的異步性質在單個線程中按順序處理每個事件。異步性質提供類似併發的行爲,例如並行處理多個網絡連接,但每個回調函數在調用下一個函數之前運行完成。

+0

即使他有線程(並沒有扭曲),python的GIL將保護他免受上述代碼中的任何錯誤。 如果你通常遇到列表的問題,而GIL是當你遍歷列表,某些塊,然後一些其他線程修改列表。 – fmoo 2013-03-21 16:37:43

+1

GIL不能防止來自單獨線程的併發訪問。 GIL只確保每個Python操作碼都運行完成,但不能確保函數完成。對任何共享數據結構的所有訪問(包括讀取和寫入)必須在線程環境中正確同步,而不僅僅是遍歷列表。 – dsh 2013-03-21 22:16:46

+0

我站好了。看起來Python會在執行一些操作碼後周期性地搶佔和/或切換線程。 – fmoo 2013-03-23 04:54:41