Skip to main content
 首页 » 编程设计

Python多线程共享变量导致UnboundLocalError

2025年05月04日25飞鱼

我打算检查很多项目,看看是否有任何项目可以满足某些条件。一个一个地遍历它们非常慢。

我想使用多个线程,每个线程检查一个较小的项目列表。一旦一个线程发现条件满足,它应该告诉所有其他线程搜索完成。

我在 Python 中遇到多线程问题。我的简化代码如下所示:

def func_with_multithread(): 
    flag = True 
 
    # a inner thread class 
    class WorkerThread(threading.Thread): 
        # ...some init work... 
        def run(self): 
             # ...check the flag... 
             if flag: 
                 # do something 
                 # can only set flag to False 
                 if condition: 
                     flag = False 
 
     # start several thread class 
     ... 

当我运行程序时,它说

UnboundLocalError: local variable 'flag' referenced before assignment

Python 似乎在提示这个赋值语句:flag = False

如果我使用 global flag 来尝试解决这个问题,它会说:

NameError: global name 'has_litigation' is not defined

但我用它通过多个线程将项目放入字典,这似乎没问题。

在我看来,不存在竞争条件,因为我只想将标志设置为 False 以告诉其他线程该退出了;无需再次将其设置为 True。

有没有办法实现我想要做的事情?

请您参考如下方法:

您遇到了 Python 2.x 的问题之一。它与多线程没有任何关系。 PEP 3104 -- 访问外部作用域中的名称 https://www.python.org/dev/peps/pep-3104/ .

在 Python 3.x 中你可以这样写:

def outer_func(): 
    flag = True 
 
    class InnerClass(object): 
        def run(self): 
            nonlocal flag 
            if flag: 
                print flag 
                flag = False 

但在 2.x 中这是不可能的。