Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的多个线程访问相同的数据_Python_Multithreading - Fatal编程技术网

Python中的多个线程访问相同的数据

Python中的多个线程访问相同的数据,python,multithreading,Python,Multithreading,我在一个装饰器中包装一个函数,这样每次调用它时,它都会在一个新线程中启动。像这样: 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 现在我有

我在一个装饰器中包装一个函数,这样每次调用它时,它都会在一个新线程中启动。像这样:

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)
def __init__(self, options, sList):
    lock = threading.RLock()
    with lock:
        self.opt = options
        self.li = sList
        self.generateFigs()
        self.saveFigsToDisk()
我从另一个类调用该类的构造函数,每次都传递新参数,如下所示:

Class CreateFigures(object):
    @threaded
    def __init__(self, options, sList):
        self.opt = options
        self.li = sList
        self.generateFigs()
        self.saveFigsToDisk()
CreateFigures(newOpts, newList)
def __init__(self, options, sList):
    lock = threading.RLock()
    with lock:
        self.opt = options
        self.li = sList
        self.generateFigs()
        self.saveFigsToDisk()
在这里,每次调用CreateFigures构造函数时,newOpts和newList都可以更改。我的问题是如何在每次启动新线程时安全地将数据传递给该构造函数。因为我目前的做法是,多个线程同时访问同一个数据会变得一团糟。我尝试用Rlock对象将CreateFigures构造函数的所有语句封装在with块中,如下所示:

Class CreateFigures(object):
    @threaded
    def __init__(self, options, sList):
        self.opt = options
        self.li = sList
        self.generateFigs()
        self.saveFigsToDisk()
CreateFigures(newOpts, newList)
def __init__(self, options, sList):
    lock = threading.RLock()
    with lock:
        self.opt = options
        self.li = sList
        self.generateFigs()
        self.saveFigsToDisk()

我认为您正在为每个线程创建一个新的RLock对象,而您需要每个线程尝试获取一个锁。但即使现在我只有一个RLock对象,似乎很快连续创建两个线程会导致选项列表发生变化。我还尝试使用如下线程本地对象:localData=threading.localData.options=options localData.sList=sList,然后尝试使用此数据。但这也会发生变异。我不知道出了什么问题。这听起来很奇怪,因为不管创建线程的顺序如何,获取锁都是原子的。你能展示更多你现在拥有的吗?好吧,现在我知道哪里出了问题,但不知道如何修复它。当CreateFiguresnewOpts时,当一个线程已经运行时,会使用newOpts和newList中的不同值再次调用newList,尽管锁阻止在线程内部执行,但构造函数外部值的更改仍然反映在它内部。我的意思清楚吗?