我正在用Python开发一个使用"thread“模块的项目。
如何创建一个项目中所有线程(大约4-6个)都可以访问的全局变量(在我的例子中,我需要它是True或False)?
发布于 2015-09-21 20:57:43
我们可以在线程类的外部定义变量,并在类的方法中声明它为全局变量。
请看下面简单的例子,它交替打印AB。两个线程Thread_A
和Thread_B
共享两个变量flag
和val
。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()
输出看起来像这样
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
每个线程打印在另一个线程中修改过的值。
发布于 2013-07-22 01:49:56
如果不知道你真正想要做的是什么,要么使用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
表示某项可用。
https://stackoverflow.com/questions/17774768
复制相似问题