2015-02-09 48 views
2

我有一個多線程的應用程序,我需要使用全局字典來記住和處理請求。有沒有辦法在python中對dict執行測試和設置操作?

問題是,我不應該執行相同的請求兩次,所以我需要字典能夠測試是否存在密鑰。如果沒有,插入它,如果是的話,報告錯誤。

所有的代碼都運行在python中,所以GIL不應該是相關的。

在Python中可行嗎?

這裏鎖定會工作,但我試圖找到一個更自然的方式來解決它。

回答

0

您當然可以創建一個字典並在線程中共享它,但您應該保護每個使用鎖定來訪問字典(無論是讀取還是寫入)。

這裏鎖的工作,但我試圖找到一種更自然的方式來 解決它。

同步原語如鎖的使用是爲執行包括併發的可靠結構的自然方式。

也就是說,確保某個請求沒有被執行兩次可以在不同的級別上進行。如果您使用上述字典進行操作,則需要在執行請求之前在之前插入標識。僞代碼:

with lock.acquire(): 
    if url in d: 
     return # do not perform request 
    d.[url] = True 

perform_request(url) 

如果請求失敗,您可能需要再次從字典中刪除密鑰(當然,並非沒有獲取鎖)。

+0

所以你的意思是在字典中沒有這樣的原子操作 – HuStmpHrrr 2015-02-09 15:32:04

+0

對於dict操作,沒有* guarantee *是原子/線程安全的,所以不要依賴它。另請參閱http://stackoverflow.com/questions/3358770/python-dictionary-is-thread-safe – 2015-02-09 15:59:39

+0

可能有Python實現(某些CPython版本,或PyPy或IronPython),某些字典操作是線程安全的,但作爲只要這沒有記錄,這是一個實現細節,你不應該建立你的架構。 – 2015-02-09 16:08:58

相關問題