在这个例子中我需要使用线程锁吗?

时间:2016-12-19 19:24:26

标签: python multithreading

我将值附加到一个线程中的嵌套列表中,然后在主线程中复制带有列表推导的增长嵌套列表。我的示例中是否需要使用线程锁?我知道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]

1 个答案:

答案 0 :(得分:1)

认为你需要一个锁,至少在一个线程中进行迭代 虽然附加在另一个中,但我认为它不会成功 在您不使用时复制数据时使用锁的意义 附加到列表时锁定。使用锁的重点 是要在列表上声明一些所有权。

你可能会问的另一个问题是什么 使用锁?您可以简单地保持代码清洁 将self.data = []替换为self.data = MySafeList()和 通过单独编写一个带锁的小线程安全列表类。 它可以通过使用其中之一很容易地编写 这里和那里提供@synchronized装饰器。例如 允许列表理解的__iter__方法可以 写成

@synchronized
def __iter__(self):
    return iter(list(list.__iter__(self)))