Я работаю над проектом на Python, используя модуль "thread".
Как создать глобальную переменную (в моем случае мне нужно, чтобы она была True или False), к которой могут обратиться все потоки моего проекта (около 4-6)?
Я работаю над проектом на Python, используя модуль "thread".
Как создать глобальную переменную (в моем случае мне нужно, чтобы она была True или False), к которой могут обратиться все потоки моего проекта (около 4-6)?
Мы можем определить переменную вне классов потоков и объявить ее глобальной в методах классов.
См. ниже тривиальный пример, который печатает 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()
Вывод выглядит как
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
Каждый поток печатает значение, которое было изменено в другом потоке.
Не имея понятия о том, что вы действительно пытаетесь сделать, либо идете с помощью 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
для обозначения того, что элемент доступен.