我将值附加到一个线程中的嵌套列表中,然后在主线程中复制带有列表推导的增长嵌套列表。我的示例中是否需要使用线程锁?我知道list.append()
方法is thread-safe,但在使用列表推导复制数据时是否需要使用锁?
如果我确实需要使用锁定,在copy_data()
中使用锁定而在GrowList._add_to_list()
中使用锁定是否合理?
import threading
import time
class GrowList(object):
def __init__(self):
self.data = []
self.stop_event = threading.Event()
self.add_to_list()
def _add_to_list(self):
sample = [1, 2, 3, 4]
while not self.stop_event.is_set():
self.data.append(sample)
time.sleep(1.0)
def add_to_list(self):
self.t = threading.Thread(target=self._add_to_list)
self.t.start()
def stop(self):
self.stop_event.set()
self.t.join()
def copy_data(nested_list):
return [row[:] for row in nested_list]
答案 0 :(得分:1)
我认为你需要一个锁,至少在一个线程中进行迭代 虽然附加在另一个中,但我认为它不会成功 在您不使用时复制数据时使用锁的意义 附加到列表时锁定。使用锁的重点 是要在列表上声明一些所有权。
你可能会问的另一个问题是什么
不使用锁?您可以简单地保持代码清洁
将self.data = []
替换为self.data = MySafeList()
和
通过单独编写一个带锁的小线程安全列表类。
它可以通过使用其中之一很容易地编写
这里和那里提供@synchronized
装饰器。例如
允许列表理解的__iter__
方法可以
写成
@synchronized
def __iter__(self):
return iter(list(list.__iter__(self)))