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