首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python在线程之间创建共享变量

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

Stack Overflow用户
提问于 2013-07-22 01:06:53
回答 2查看 103.5K关注 0票数 38

我正在用Python开发一个使用"thread“模块的项目。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-21 20:57:43

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

请看下面简单的例子,它交替打印AB。两个线程Thread_AThread_B共享两个变量flagvalThread_A打印val=20,然后将val设置为30。Thread_B打印val=30,因为val是在Thread_A中修改的。然后,Thread_Bval设置为20,这在Thread_A中也会使用。这说明变量val在两个线程之间共享。类似地,变量flag也在两个线程之间共享。

代码语言:javascript
运行
复制
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()

输出看起来像这样

代码语言:javascript
运行
复制
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30

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

票数 37
EN

Stack Overflow用户

发布于 2013-07-22 01:49:56

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

docs

代码语言:javascript
运行
复制
# 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表示某项可用。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17774768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档