我知道python中的內置集合類型通常不是線程安全的,但this回答稱從兩個競爭線程中調用pop()是安全的。當然,你可能會遇到異常,但是你的數據沒有被破壞。我似乎無法找到驗證此聲明的文檔。這是真的嗎?請記錄文件!在Python中,是set.pop()線程安全嗎?
回答
如果你看set.pop
method in the CPython source你會發現它不釋放GIL。
這意味着只有一個set.pop
將在CPython過程中一次發生。
由於set.pop
checks if the set is empty,您不能通過嘗試從空集彈出而導致除IndexError
之外的任何內容。
所以不,你不能通過使用CPython在多個線程中彈出集合來破壞數據。
接受這個答案,因爲它解決了我眼前的問題。請注意fffuuuutttuuuurree的讀者:請注意@Niklas(以上)的評論。 – 2012-03-30 15:27:18
我相信Set「pop」操作是線程安全的,因爲它是原子的,因爲兩個線程將無法彈出相同的值。
例如,如果另一個線程遍歷該集合,我不會依賴它的行爲。
我也找不到任何具體的文檔,只是一些指向這個方向的話題。 Python官方文檔確實會受益於這種信息。
查看我答案中的源代碼鏈接。在CPython中,'set.next'和'set.pop'不能同時發生,所以最糟糕的情況是如果你從序列中刪除一個項目,同時在'for '循環 - 你跳過一個項目。 – agf 2012-03-28 17:08:24
- 1. 在Python線程安全嗎?
- 2. python logger線程安全嗎?
- 3. python zipfile是線程安全的嗎?
- 4. 是python dict.items()線程安全嗎?
- 5. 在SignalR中是Hub.Context線程安全嗎?
- 6. 是DatagramSocket.send線程安全嗎?
- 7. 是TcpClient.Available線程安全嗎?
- 8. 線程安全(是嗎?)
- 9. 是unique_ptr線程安全嗎?
- 10. 是System.DirectoryServices.AccountManagement.GroupPrincipal線程安全嗎?
- 11. 是sqlite.swift線程安全嗎?
- 12. 是DocumentBuilder.parse()線程安全嗎?
- 13. 是Microsoft.Practices.EnterpriseLibrary.Data.Database.SetParameterValue線程安全嗎?
- 14. 是長線程安全嗎?
- 15. 是javax.sql.DataSource線程安全嗎?
- 16. 是java.util.UUID線程安全嗎?
- 17. 這段代碼在python 2.7中是線程安全的嗎?
- 18. 是C#中的CreateDirectory()線程安全嗎?
- 19. 這個Python代碼線程安全嗎?
- 20. Python重新加載線程安全嗎?
- 21. Python中的+ =運算符是線程安全的嗎?
- 22. Python中的文件輸入是線程安全的嗎?
- 23. python函數是線程安全嗎? (特別是這個?)
- 24. 在Python3中,`urllib.request`線程安全嗎?
- 25. 在Delphi中,OutputDebugString線程安全嗎?
- 26. 是Netty Channel.close()線程安全嗎?
- 27. 這是使用Parallel.ForEach()線程安全嗎?
- 28. EJB 3.0,是線程安全的嗎?
- 29. LWP :: UserAgent不是線程安全的嗎?
- 30. 是LinkedList實現.Net線程安全嗎?
看看Python源代碼,'set'對象只是帶有一些方便的方法的字典。 – Blender 2012-03-28 15:49:58
我認爲[你正在尋找的答案](http://stackoverflow.com/a/2227210/1132524)是你指出的那個。閱讀評論並查看[GIL](http://wiki.python.org/moin/GlobalInterpreterLock)是什麼。 – 2012-03-28 15:50:56
同樣的問題你鏈接說,可變類型不是線程安全的:http://stackoverflow.com/a/2227220/104847你必須實現鎖定機制,所以你沒有競爭條件。 – Ale 2012-03-28 15:53:51