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

Sha*_*hay 23 python multithreading

我正在使用"线程"模块在Python中开发一个项目.

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

小智 24

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

请看下面简单的例子,它打印AB.两个变量flagval两个线程之间共享Thread_AThread_B.Thread_A打印val=20然后设置val为30. Thread_B打印val=30,因为val已修改Thread_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()
Run Code Online (Sandbox Code Playgroud)

输出看起来像

A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么不将`c`(`threading.Condition()`)定义为`global`? (5认同)
  • @Shai,因为它没有被重新分配。事实并非如此。另一方面,flag 和 val 被重新分配,那么该分配应该创建局部变量还是修改全局变量?如果没有 global 关键字,它是不明确的。但是 `c` 没有被重新分配,所以它没有歧义。 (2认同)
  • @matanster是的,两个线程应该在同一个源文件中创建。这不是一个最佳解决方案,不知道为什么它会被接受!我正在尝试找到一种方法来完成队列.. (2认同)

doc*_*ove 7

不知道你真正想要做什么,要么采用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()
Run Code Online (Sandbox Code Playgroud)

你可以使用它来让一个线程告诉另一个线程已经满足条件,而不必明确地考虑锁.此示例用于cv表示项目可用.