Python在线程之间创建共享变量

Python在线程之间创建共享变量,python,multithreading,Python,Multithreading,我正在用Python编写一个使用“线程”模块的项目 我如何能生成一个全局变量(在我的情况下,我需要它是真的还是假的),我的项目中的所有线程(大约4-6)都可以访问?,对于你真正想要做的没有线索,要么用NiO的方法,使用锁,要么考虑条件变量: 从 您可以使用它让一个线程告诉另一个线程一个条件已经满足,而不必显式地考虑锁。本例使用cv表示一个项目可用。我们可以在线程类外部定义变量,并在类的方法内部声明它为全局变量 请参阅下面的小示例,它交替打印AB。两个线程之间共享两个变量flag和val线程A打印

我正在用Python编写一个使用“线程”模块的项目


我如何能生成一个全局变量(在我的情况下,我需要它是真的还是假的),我的项目中的所有线程(大约4-6)都可以访问?

,对于你真正想要做的没有线索,要么用NiO的方法,使用锁,要么考虑条件变量:


您可以使用它让一个线程告诉另一个线程一个条件已经满足,而不必显式地考虑锁。本例使用
cv
表示一个项目可用。

我们可以在线程类外部定义变量,并在类的方法内部声明它为全局变量

请参阅下面的小示例,它交替打印AB。两个线程之间共享两个变量
flag
val
<代码>线程A打印
val=20
,然后将
val
设置为30
Thread\u B
打印
val=30
,因为
val
Thread\u A
中被修改
Thread_B
然后将
val
设置为20,该值在
Thread_A
中再次使用。这表明变量
val
在两个线程之间共享。类似地,变量
flag
也在两个线程之间共享

import threading
import time
c = threading.Condition()
flag = 0      #shared between Thread_A and Thread_B
val = 20

class Thread_A(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name

    def run(self):
        global flag
        global val     #made global here
        while True:
            c.acquire()
            if flag == 0:
                print "A: val=" + str(val)
                time.sleep(0.1)
                flag = 1
                val = 30
                c.notify_all()
            else:
                c.wait()
            c.release()


class Thread_B(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name

    def run(self):
        global flag
        global val    #made global here
        while True:
            c.acquire()
            if flag == 1:
                print "B: val=" + str(val)
                time.sleep(0.5)
                flag = 0
                val = 20
                c.notify_all()
            else:
                c.wait()
            c.release()


a = Thread_A("myThread_name_A")
b = Thread_B("myThread_name_B")

b.start()
a.start()

a.join()
b.join()
输出看起来像

A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30

每个线程都打印在另一个线程中修改的值。

您实际上想做什么?如果您想要某种“keepRunning”变量,可能有比全局变量更好的方法。您尝试过什么?在寻找你问题的答案时,那些不起作用的简短代码示例总是很有帮助的。你只是在问如何使一个全球性的问题?在模块级声明它,然后使用defs中的
global
关键字访问它。@shay:不要使用
线程
模块。相反,请使用
threading
模块。为什么
c
threading.Condition()
)没有被定义为
global
?@Shai,因为它没有被重新分配。不需要这样做。另一方面,Flag和val是重新赋值的,那么该赋值应该创建局部变量,还是修改全局变量?没有全局关键字是不明确的。但是
c
没有被重新分配,所以它并不含糊不清。这假设两个线程都是在同一个源文件中创建的,所以它们都有(闭包样式)访问全局名称的权限,不是吗?
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30