Как работает область действия глобальной переменной в потоках? - PullRequest
0 голосов
/ 12 февраля 2020

У меня запущены два потока, и я хочу, чтобы они ждали друг друга в указанной строке c, используя threading.Condition (). Однако кажется, что глобальная переменная v не является глобальной. Это разные переменные для каждого потока. Вот минимальный жизнеспособный продукт:

import threading
lock = threading.Condition()
v = 0
n = 2

def barrier():
    with lock:
        global v
        v =+ 1
        print("v is increased to " + str(v))
        if v == n:
            print("v is equal to n")
            lock.notifyAll()
            print("v equals n")
            v = 0
        else:
            lock.wait()




class ServerThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        print("before barrier")
        barrier()
        print("after barrier")



for i in range(2):
            t = ServerThread()
            t.start()

Вывод такой:

before barrier
v is increased to 1
before barrier
v is increased to 1

, но я хочу, чтобы v был увеличен до 2 второй нитью, чтобы барьер мог быть прошло. Что не так?

1 Ответ

0 голосов
/ 12 февраля 2020

Вы можете использовать очередь для обмена данными между потоками. Я не уверен, что этот код будет работать в соответствии с вашим вариантом использования, но вы можете сделать что-то вроде этого:

import threading, queue
lock = threading.Condition()
q = queue.Queue()
q.put(0)
n = 2

def barrier():
    with lock:
        v_increase = q.get() + 1
        q.put(v_increase)
        print("v is increased to " + str(v_increase))
        if v_increase == n:
            print("v is equal to n")
            lock.notifyAll()
            print("v equals n")
            q.get()
            q.put(0)
        else:
            lock.wait()




class ServerThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global v
        print("before barrier")
        barrier()
        print("after barrier")



for i in range(2):
            t = ServerThread()
            t.start()
...