我将值附加到一个线程中的嵌套列表,然后在主线程中使用列表理解复制不断增长的嵌套列表。我的示例中需要使用线程锁吗?我知道list.append()
method 是线程安全的 http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm,但是在使用列表理解复制数据时是否需要使用锁?
如果我确实需要使用锁,那么使用锁是否有意义?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]
I think您至少需要一把锁才能在一个线程中进行迭代
同时附加在另一个中,并且我think它不会使
当你不使用时复制数据时使用锁是有意义的
追加到列表时的锁。使用锁的要点
是要求列表上的一些所有权。
您可能会问的另一个问题是,这样做的意义何在?not使用锁?您可以通过简单地保持代码整洁
替换self.data = []
by self.data = MySafeList()
和
通过单独编写一个带锁的小型线程安全列表类。
通过使用众多的之一可以很容易地编写它@synchronized
装饰器随处可用。例如
这__iter__
允许列表理解的方法可以是
写成
@synchronized
def __iter__(self):
return iter(list(list.__iter__(self)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)