當我在Queue中放置一個對象時,是否需要創建對象的深層副本,然後放入隊列?python多處理隊列對象放置安全嗎?
2
A
回答
1
如果您可以確保對象只在一個線程中處理,這不是問題。但是,如果你不能,建議使用深層複製。
如果將對象放入隊列中,隊列對象不會自動執行此操作。
見參考文獻
- Multithreading, Python and passed arguments
- Python in Practice: Create Better Programs Using Concurrency... p.154
請記住,對象必須能夠被醃(Multiprocessing Basics)
通常更加有用能夠通過參數產生一個過程來告訴它做什麼工作。與線程不同,要將參數傳遞給多處理進程,參數必須能夠使用pickle序列化。這個例子傳遞每個工人一個數字,所以輸出更有趣一些。
2
put
隊列中的操作不會創建對象的副本(或深度副本),因此您在哪裏創建深度副本或完全取決於您期望並希望實現的行爲。
如果您將對象放入隊列並將對象修改爲外部並且還希望將更改反映到隊列中的對象中,則不要創建深度複製。
否則,請創建一個深層副本,以便在外部進行的更改不會反映在隊列中的對象上。
SO上還有一篇相關文章:Python multiprocessing.Queue modifies objects。如果您檢查接受的答案,則建議在隊列中使用不可變對象(如果不是深度複製,則使用)。
相關問題
- 1. Python多處理隊列
- 2. Python安全隊列
- 3. Python多處理 - '隊列'對象沒有任何屬性'task_done'/'join'
- 4. 多處理隊列不釋放內存
- 5. 多處理Python類對象
- 6. 在python中使用多處理時可以安全地使用全局隊列嗎?
- 7. Python多處理:pool.map vs使用隊列
- 8. Python中的多處理隊列
- 9. Python多處理隊列緩慢
- 10. python多處理隊列獲取並把
- 11. Python的多處理和隊列
- 12. Python多處理 - 管vs隊列
- 13. Python多處理工作者/隊列
- 14. Python的多處理隊列可靠性,隊列VS SimpleQueue VS JoinableQueue
- 15. python隊列和多處理隊列:他們如何表現?
- 16. 是Python多處理.Queue線程安全嗎?
- 17. 我們有一個java隊列對象或機制來處理批處理嗎?
- 18. 多處理和隊列
- 19. 多處理隊列已滿
- 20. 線程/多處理/隊列?
- 21. 多處理池和隊列
- 22. VB/C#:在全球範圍內放置可處理對象:這樣好嗎?
- 23. ActiveMQ安全隊列
- 24. Python對象封裝安全
- 25. 在python多處理中修改對象
- 26. Python的多處理與unpicklable對象
- 27. Python多處理.Queue修改對象
- 28. 處理Python中的GUID對象列表
- 29. Python:安裝多處理
- 30. 使用隊列列表的Python多處理
我相信對象在被轉移到接收過程之前被酸洗(即你不在同一個副本上工作) – thebjorn
@Majid請接受答案並關閉問題。 – ppasler