我想知道Python內置容器(list,vector,set ...)是否是線程安全的?或者我是否需要爲我的共享變量實現鎖定/解鎖環境?Python內置容器是否線程安全?
回答
您需要爲所有將在Python中修改的共享變量實現自己的鎖定。你不必擔心從不會被修改的變量(即併發讀取可以)讀取數據,所以不可變類型(frozenset
,tuple
,str
)是,可能是安全的,但它不會受到傷害。對於你將要改變的東西 - list
,set
,dict
和大多數其他對象,你應該有自己的鎖定機制(雖然就地操作對大多數這些都是可以的,但是線程會導致超級討厭的錯誤 - 你可能還會實現鎖定,這很容易)。
順便說一句,我不知道你是否知道這一點,但鎖定在Python很容易 - 創建一個threading.lock對象,然後你可以獲取/釋放它是這樣的:
import threading
list1Lock = threading.Lock()
with list1Lock:
# change or read from the list here
# continue doing other stuff (the lock is released when you leave the with block)
在Python 2.5中,請執行from __future__ import with_statement
; Python的2.4和之前沒有這個,所以你會希望把採集()/釋放()調用try:...finally:
塊:
Some very good information about thread synchronization in Python。
是的,但你仍然需要小心,當然
。例如:
如果兩個線程都從列表中只有一個項目競相pop()
,一個線程將成功獲得該項目和其他將得到一個IndexError
這樣的代碼是不是線程安全的
if L:
item=L.pop() # L might be empty by the time this line gets executed
你應該WR像這樣迭代它
try:
item=L.pop()
except IndexError:
# No items left
我想彈出()是線程安全的,但我無法在文檔中的任何位置找到這個事實。在我把它作爲福音之前,有人能幫我找出這個說法嗎? – 2012-03-28 13:12:41
真的嗎? list.pop()不是線程安全的?我看到另一篇文章宣稱相反。 http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm – 2016-10-03 18:50:34
@ Zhongjun'Mark'Jin他說它是線程安全的..但這並不意味着你不必考慮其他線程。如果一個線程彈出最後一個項目,然後另一個線程嘗試彈出,它會得到IndexError,正如他所說的。 – fantabolous 2016-12-07 05:46:27
- 1. ValueStack容器是否線程安全?
- 2. 是否Box.add()線程安全?
- 3. 是否mysql_insert_id線程安全?
- 4. NashornScriptEngine是否線程安全?
- 5. RegExp.MatchString是否線程安全?
- 6. SeekableStream是否線程安全?
- 7. 是否log4j線程安全?
- 8. NSPasteboard是否線程安全?
- 9. LIBSVM是否安全線程
- 10. epoll是否線程安全?
- 11. 是否NotifyPropertyChanged線程安全?
- 12. phpMyAdmin是否內置安全
- 13. 線程是否表示線程安全?
- 14. 部分線程安全是否使Java類線程安全?
- 15. 是System.ServiceModel.Channels.BufferManager是否線程安全?
- 16. Android FragmentTransaction.replace()是否是線程安全的?
- 17. 是否是setlocale線程安全函數?
- 18. ASP.NET PostBack是否保持內容安全
- 19. 進程線程是否安全?
- 20. 修改STL容器的內容是否安全?
- 21. 棱鏡容器解決線程安全
- 22. 寫入線程安全容器
- 23. 線程安全關聯容器
- 24. 數組中的線程安全容器
- 25. 是python中的全局計數器線程安全嗎?
- 26. 內容處置安全
- 27. python迭代器和線程安全
- 28. python zipfile是線程安全的嗎?
- 29. 是python dict.items()線程安全嗎?
- 30. 是list.pop在Python線程安全
我相信,對於之前沒有使用過線程鎖的人來說,應該注意的是鎖(在你的例子中,'list1Lock')應該在線程之間共享*,以便它能夠正常工作。兩個獨立的鎖,每個線程一個鎖,什麼都不會鎖,只會增加傻瓜的開銷。 – tzot 2010-02-18 08:44:53
不應該是這樣: with list1Lock:#做東西 – 2011-05-20 08:09:49
@ slack3r良好的調用! – 2011-05-20 17:59:55