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

时间:2013-07-21 17:06:53

标签: python multithreading

我正在使用“线程”模块在Python上开展一个项目。

如何创建一个全局变量(在我的情况下,我需要它为True或False)我的项目中的所有线程(大约4-6)都可以访问?

2 个答案:

答案 0 :(得分:20)

我们可以在线程类之外定义变量,并在类的方法中将其声明为全局。

请看下面打印AB的简单示例。两个变量flagval在两个线程Thread_AThread_B之间共享。 Thread_A打印val=20,然后将val设置为30. Thread_B打印val=30,因为在val中修改了Thread_AThread_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

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

答案 1 :(得分:8)

不知道你真正想要做什么,要么采用nio的方法并使用锁,要么考虑条件变量:

来自docs

# Consume one item
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()

# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()

您可以使用它让一个线程告诉另一个线程已满足条件,而无需明确考虑锁定。此示例使用cv表示某个项目可用。