Python多线程共享变量导致UnboundLocalError

时间:2015-12-18 03:18:38

标签: python multithreading

我打算检查很多项目,以确定它们中是否有任何条件可以满足某些条件。逐个迭代它们非常慢。

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

我在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

如果我使用global flag尝试解决此问题,请说:

  

NameError:未定义全局名称'has_litigation'

但是我使用它来使用多个线程将项目放入dict,这似乎没问题。

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

无论如何要实现我想要做的事情吗?

1 个答案:

答案 0 :(得分:1)

你偶然发现了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中它是不可能的。