我想知道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