我在一个装饰器中包装一个函数,这样每次调用它时都会在一个新线程中启动。像这样:
def threaded(func):
def start_thread(*args, **kw):
"""Spawn a new thread on the target function"""
threading.Thread(target=func, args=args, kwargs=kw).start()
return start_thread
现在我有一个类,我的init方法每次都要在一个单独的线程中运行它自己的数据。我们的想法是为它提供所需的所有数据,并在init方法结束时完成我的工作。所以我的课程是这样的:
Class CreateFigures(object):
@threaded
def __init__(self, options, sList):
self.opt = options
self.li = sList
self.generateFigs()
self.saveFigsToDisk()
我从另一个类调用此类的构造函数,每次都传递新参数,如下所示:
CreateFigures(newOpts, newList)
每次调用CreateFigures()构造函数时,newOpts和newList都可以更改。我的问题是每次我想要启动一个新线程时如何安全地将数据传递给这个构造函数。因为我现在这样做,所以多个线程一次访问相同的数据就变得一团糟。我尝试在带有Rlock对象的with块中包含CreateFigures()构造函数的所有语句,如下所示:
def __init__(self, options, sList):
lock = threading.RLock()
with lock:
self.opt = options
self.li = sList
self.generateFigs()
self.saveFigsToDisk()