Python在线程之间创建共享变量
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17774768/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Python creating a shared variable between threads
提问by Shay
I'm working on a project in Python using the "thread" module.
我正在使用“线程”模块在 Python 中处理一个项目。
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?
如何创建一个全局变量(在我的情况下我需要它是 True 或 False),我的项目中的所有线程(大约 4-6 个)都可以访问?
采纳答案by user3343166
We can define the variable outside the thread classes and declare it global inside the methods of the classes.
我们可以在线程类之外定义变量,并在类的方法中将其声明为全局变量。
Please see below trivial example which prints AB alternatively. Two variables flag
and val
are shared between two threads Thread_A
and Thread_B
. Thread_A
prints val=20
and then sets val
to 30. Thread_B
prints val=30
, since val
is modified in Thread_A
. Thread_B
then sets val
to 20 which is again used in Thread_A
. This demonstrates that variable val
is shared between two threads. Similarly variable flag
is also shared between two threads.
请参阅下面交替打印 AB 的简单示例。两个变量flag
和val
在两个线程Thread_A
和之间共享Thread_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()
Output looks like
输出看起来像
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
Each thread prints the value which was modified in another thread.
每个线程打印在另一个线程中修改的值。
回答by doctorlove
With no clue as to what you are really trying to do, either go with nio's approach and use locks, or consider condition variables:
不知道您真正想要做什么,要么采用 nio 的方法并使用锁,要么考虑条件变量:
From the 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()
You can use this to let one thread tell another a condition has been met, without having to think about the locks explicitly. This example uses cv
to signify that an item is available.
您可以使用它让一个线程告诉另一个线程已满足条件,而无需明确考虑锁。此示例用于cv
表示项目可用。