Python多线程共享变量导致UnboundLocalError

Python多线程共享变量导致UnboundLocalError,python,multithreading,Python,Multithreading,我打算检查很多项目,看看其中是否有一项能够满足某些条件。一个接一个地迭代是非常缓慢的 我想使用多个线程,每个线程检查一个较小的项目列表。一旦一个线程发现满足条件,它应该告诉所有其他线程搜索已经完成 我在Python中遇到了多线程问题。我的简化代码如下所示: def func_with_multithread(): flag = True # a inner thread class class WorkerThread(threading.Thread):

我打算检查很多项目,看看其中是否有一项能够满足某些条件。一个接一个地迭代是非常缓慢的

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

我在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:之前引用的局部变量“flag” 分配

Python似乎在抱怨这个赋值语句:
flag=False

如果我使用
全局标志
尝试解决此问题,它会显示:

NameError:未定义全局名称“has_诉讼”

但是我用它把项目放到一个dict中,使用了几个线程,这看起来还可以

在我看来,没有竞争条件,因为我只想将标志设置为False来告诉其他线程是时候退出了;没有必要再次将其设置为True


还有什么方法可以实现我想做的吗?

您遇到了Python2.x的一个问题。它与多线程没有任何关系。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中这是不可能的。

有许可证
在您发布的代码中没有。请发布真实的可运行代码。还有一些关于为什么要在Python中使用线程的注释会很有帮助。您使用的是哪一版本的Python?2.X或3.X?@Ingaz我的Python版本是2.7.10,使用多线程不会导致
UnboundLocal
错误。赋值给函数中的变量会创建一个局部变量,而该局部变量又会隐藏周围的一个作用域。顺便说一句:不需要仅仅为了在线程中运行一些代码而创建类,使用普通函数是一种更干净、更简单的选择。@UlrichEckhardt感谢您的建议。我希望所有这些线程都能访问函数中的局部变量,普通函数能满足这个要求吗?也许是一个内部函数?谢谢,我在dict中加入了这个标志来处理Python2.x