我有一个使用线程计时器的脚本,该脚本随机操作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_1
,variable_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]