我正在清理我在……不那么知识渊博时编写的一些 Python 代码。主要是因为对 Python 中的线程的不完全理解而产生的一些复杂性。我需要制作一个线程安全的项目列表,并且我想通过不可变列表来完成它,而不是通常的锁定方法。我知道不可变对象在线程方面非常特殊,因为围绕不完整状态更改的所有线程安全问题都会消失。
所以,我问:下面的代码是线程安全的吗?
class ImmutableList(object):
def __init__(self):
self._list = ()
def __iter__(self):
return self._list.__iter__()
def append(self, x):
self._list = self._list + tuple([x])
我认为是,因为每次都会构建一个新列表。如果在另一个线程迭代列表时更新了列表,则旧列表将继续用于剩余的迭代。这对我来说很好,但可能并不适合所有人。
另外,这是个好主意吗?我只想将此应用于列表大小较小且列表没有太大变化的少数情况(事件侦听器会浮现在脑海中)。