38

I'm working on a project in Python using the "thread" module.

How can I make a global variable (in my case I need it to be True or False) that all the threads in my project (about 4-6) can access?

4

2 回答 2

40

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

请参阅下面交替打印 AB 的简单示例。两个变量flag和在两个线程和val之间共享。打印,然后设置为 30。打印,因为在 中修改。然后设置为 20 再次用于. 这表明变量在两个线程之间共享。同样,变量也在两个线程之间共享。Thread_AThread_BThread_Aval=20valThread_Bval=30valThread_AThread_BvalThread_Avalflag

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

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

于 2015-09-21T12:57:43.260 回答
9

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

文档

# 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表示项目可用。

于 2013-07-21T17:49:56.000 回答