在类方法中跨线程共享本地数据

时间:2014-06-02 21:36:20

标签: python multithreading

我在类中定义了一个方法,如下所示:

from Queue import Queue
from threading import Thread, Lock

class Example(object):
    def f(self):
        things = [] # list of some objects to process

        my_set = set()
        my_dict = {}
        my_list = []

        def update(q, t_lock, my_set, my_dict, my_list):
            while True:
                thing = q.get()

                new_set, new_dict, new_list = otherclass.method(thing)

                with t_lock:
                    my_set = set_overlay(my_set, new_set)
                    my_dict.update(new_dict)
                    my_list += new_list

                q.task_done()

        q = Queue()
        num_threads = 10
        thread_lock = Lock()

        for i in range(num_threads):
            worker = Thread(target=update, args=(q, thread_lock, my_set, my_dict, my_list))
            worker.setDaemon(True)
            worker.start()

        for t in things:
            q.put(t)

        q.join()

正如您所看到的那样,我尝试更新变量my_setmy_dictmy_list,其中包含来自内部定义的线索update方法的一些结果f方法。我可以将它们全部传递给更新函数,但这仅适用于可变数据类型。

我将此更新为使用threading.Lock()作为用户maxywb建议,但我想保留以下相同的问题,以便在包含锁定时回答。

我的问题是:

  1. 这线程安全吗?我可以保证不会丢失任何变量的更新吗?
  2. 如果我想在int的结果中添加一个otherclass.method(thing)的{​​{1}}混合变量,那该怎么办?我该怎么做呢?
  3. 有没有更好的方法来做这个/架构师?这里的想法是从线程更新类方法的本地变量,同时在线程之间共享(希望)线程安全引用该变量。

0 个答案:

没有答案