Циклическое приращение переменной x на шаг = 1 между двумя файлами - PullRequest
0 голосов
/ 31 января 2020

Как можно выполнить круговое приращение (python 3.8) переменной x на шаг = 1 между двумя файлами "a.py" и "b.py"? Первоначально х = 0 в "a.py"; если «b.py» (или «a.py») выполняет другой файл, x становится x = 1 (первое увеличение), тогда когда «a.py» (или «b.py») запускает другой файл, x становится x = 2 (второй прирост) и т. д. до x = 10.

Я попытался (неудачной) попыткой:

b.py

from a import *
u=v+1;
exec(open("a.py").read());

a. py

v=0;
from b import *
v=u+1;
print(v);
exec(open("b.py").read());

1 Ответ

0 голосов
/ 31 января 2020

Вы спрашиваете о общих значениях .

Но вам необходимо изменить дизайн своего приложения. Вместо двух разных файлов a.py и b.py вам нужен один главный файл, который объединяет оба:

from multiprocessing import Process, Manager

def a_worker(shared_var, *args):
    print("A", shared_var.value, args)
    shared_var.value += 1

def b_worker(shared_var, *args):
    print("B", shared_var.value, args)
    shared_var.value += 1

if __name__ == "__main__":
    manager = Manager()
    var = manager.Value('i', 0) # shared variable

    print("Initial value: ", var.value)

    a_proc = Process(target=a_worker, args=(var, "a_args"))
    b_proc = Process(target=b_worker, args=(var, "b_args"))

    # Spawn processes
    a_proc.start() 
    b_proc.start()

    # Wait for processes to terminate
    a_proc.join()
    b_proc.join()

    print("After a & b finished: ", var.value)

Здесь a_worker и b_worker - это функции, которые реализуют бизнес-логи c a.py и b.py. Подробнее см. Python многопроцессорная библиотека

ОБНОВЛЕНИЕ

Стратегия пинг-понга. Процесс A увеличивается, затем процесс B увеличивается, затем процесс A увеличивается, затем ... пока общая переменная не достигнет 10:

from multiprocessing import Process, Manager, Pipe

def a_worker(shared_var, pipe):
    while shared_var.value < 10:
        print("A", shared_var.value)
        shared_var.value += 1
        pipe.send("Your turn")
        pipe.recv()
    pipe.close()

def b_worker(shared_var, pipe):
    while shared_var.value < 10:
        pipe.recv()
        print("B", shared_var.value)
        shared_var.value += 1
        pipe.send("Your turn")
    pipe.close()

if __name__ == "__main__":
    manager = Manager()
    var = manager.Value('i', 0) # shared variable
    a_conn, b_conn = Pipe()

    print("Initial value: ", var.value)

    a_proc = Process(target=a_worker, args=(var, a_conn))
    b_proc = Process(target=b_worker, args=(var, b_conn))

    # Spawn processes
    a_proc.start() 
    b_proc.start()

    # Wait for processes to terminate
    a_proc.join()
    b_proc.join()

    print("After a & b finished: ", var.value)

Эта программа использует конвейер для координации A и B. Процесс A запускается, что-то делает , затем передает управление B и ждет, пока оно не вернется обратно. Процесс B начинает ждать A, получает сообщение от A, увеличивает переменную и передает управление обратно.

...