Python создает общую переменную между потоками

Я работаю над проектом на Python, используя модуль "thread".

Как создать глобальную переменную (в моем случае мне нужно, чтобы она была True или False), к которой могут обратиться все потоки моего проекта (около 4-6)?

Ответ 1

Мы можем определить переменную вне классов потоков и объявить ее глобальной в методах классов.

См. ниже тривиальный пример, который печатает 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

Каждый поток печатает значение, которое было изменено в другом потоке.

Ответ 2

Не имея понятия о том, что вы действительно пытаетесь сделать, либо идете с помощью 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 для обозначения того, что элемент доступен.