我有一个使用线程计时器的脚本,该脚本随机操作2个公共列表。

因为类实例在线程计时器上操纵列表,所以我无法将变量传递给类并返回。

…所有类的实例都需要操作一个最新的列表。

因此,这些列表的范围设置为全局。但是,我需要范围在类级别,但要由多个类操纵。

澄清...

这是基本程序结构:

Global list variable_1
Global list variable_2

class MasterClass:
    # this creates instances of the threaded classes.
    There are 50+ instances of MasterClass creating thousands
    of instances of ThreadedClass1, 2, & 3.  All manipulate
    global list variables 1 & 2.

class ThreadedClass1:
    # threaded classes manipulate global list variables 1 & 2 on random timers.

class ThreadedClass2:

class ThreadedClass3:


问题:对于每个MasterClass实例,我需要一个单独的列表变量1和2。每个MasterClass实例调用的ThreadedClasses实例必须只能操纵该MasterClass实例拥有的列表变量。

基本上,我需要一个等效的全局列表变量,但我需要将其由MasterClass实例封装,并由仅由MasterClass实例调用的ThreadedClasses实例进行操纵。

怎么样了

最佳答案

尝试将MasterClass实例传递给每个ThreadedClasses产生的实例。

然后,在MasterClass中定义线程保存方法,这些方法将使用您的variable_1variable_2执行操作。 ThreadedClasses不得仅通过调用这些方法直接触摸此列表。

小例子(检查subclassing from object):

import threading


class ThreadedClassBase(object):
    def __init__(self, master, *args, **kwargs):
        self.master = master

    def do_something(self):
        self.master.append(1, 'some_value')
        value = self.master.getitem(1, 0)


class ThreadedClass1(ThreadedClassBase):
    def __init__(self, *args, **kwargs):
        super(ThreadedClass1, self).__init__(*args, **kwargs)
        # ...

# same for ThreadedClass2, 3


class MasterClass(object):
    def __init__(self, *args, **kwargs):
        self.variable_1 = list()
        self.variable_2 = list()
        self.lock = threading.Lock()
        for i in range(50):
            ThreadedClass1(master=self)
            # create new thread

    def append(list_nb, value):
        with self.lock:
            getattr('variable_' + list_nb).append(value)

    def getitem(list_nb, index):
        with self.lock:
            return getattr('variable_' + list_nb)[index]

07-26 04:57