2
我有一個多線程的應用程序,我需要使用全局字典來記住和處理請求。有沒有辦法在python中對dict執行測試和設置操作?
問題是,我不應該執行相同的請求兩次,所以我需要字典能夠測試是否存在密鑰。如果沒有,插入它,如果是的話,報告錯誤。
所有的代碼都運行在python中,所以GIL不應該是相關的。
在Python中可行嗎?
這裏鎖定會工作,但我試圖找到一個更自然的方式來解決它。
我有一個多線程的應用程序,我需要使用全局字典來記住和處理請求。有沒有辦法在python中對dict執行測試和設置操作?
問題是,我不應該執行相同的請求兩次,所以我需要字典能夠測試是否存在密鑰。如果沒有,插入它,如果是的話,報告錯誤。
所有的代碼都運行在python中,所以GIL不應該是相關的。
在Python中可行嗎?
這裏鎖定會工作,但我試圖找到一個更自然的方式來解決它。
您當然可以創建一個字典並在線程中共享它,但您應該保護每個使用鎖定來訪問字典(無論是讀取還是寫入)。
這裏鎖的工作,但我試圖找到一種更自然的方式來 解決它。
同步原語如鎖的使用是爲執行包括併發的可靠結構的自然方式。
也就是說,確保某個請求沒有被執行兩次可以在不同的級別上進行。如果您使用上述字典進行操作,則需要在執行請求之前在之前插入標識。僞代碼:
with lock.acquire():
if url in d:
return # do not perform request
d.[url] = True
perform_request(url)
如果請求失敗,您可能需要再次從字典中刪除密鑰(當然,並非沒有獲取鎖)。
所以你的意思是在字典中沒有這樣的原子操作 – HuStmpHrrr 2015-02-09 15:32:04
對於dict操作,沒有* guarantee *是原子/線程安全的,所以不要依賴它。另請參閱http://stackoverflow.com/questions/3358770/python-dictionary-is-thread-safe – 2015-02-09 15:59:39
可能有Python實現(某些CPython版本,或PyPy或IronPython),某些字典操作是線程安全的,但作爲只要這沒有記錄,這是一個實現細節,你不應該建立你的架構。 – 2015-02-09 16:08:58