Обновите переменную Python в цикле и используйте ее в другом процессе - PullRequest
0 голосов
/ 20 февраля 2019

Почему цикл while игнорируется в work1?Я хотел бы обновить значение из строки в другое значение в цикле и вывести это значение в процессе работы2.Также уже пробовал с Queue, но проблема в том, что у меня есть только одна переменная, которую я хотел бы обновить в work1 и доступ к ней на work2.

from multiprocessing import Process, Manager, Value
from ctypes import c_char_p
import time

def work1(string):
    i = 2

    string.value = i
    # while True:
        # print("work1")
        # string.value = i + 1
        # time.sleep(2)

def work2(string):
    while True:
        print("Value set in work1 " + str(string.value))
        time.sleep(2)

if __name__ == '__main__':
    manager = Manager()
    string = manager.Value(int, 0);

    p1=Process(target=work1, args=(string,))
    p1.start()
    p1.join()

    p2=Process(target=work2, args=(string,))
    p2.start()
    p2.join()

1 Ответ

0 голосов
/ 20 февраля 2019

Это потому, что вы не делали свою программу параллельной с двумя процессами, а вместо этого два процесса выполнялись в тандеме.Что вам нужно сделать, это запустить оба процесса до любого join.Как моя модификация ниже:

from multiprocessing import Process, Manager, Value
from ctypes import c_char_p
import time

def work1(string):
    i = 2
    string.value = i
    while True:
        i = i+1
        string.value = i
        print("work1 set value to "+str(string.value))
        time.sleep(2)

def work2(string):
    while True:
        print("Value set in work1 " + str(string.value))
        time.sleep(2)

if __name__ == '__main__':
    manager = Manager()
    string = manager.Value(int, 0, lock=False);

    p1=Process(target=work1, args=(string,))
    p2=Process(target=work2, args=(string,))
    p1.start()
    p2.start()
    p2.join()
    p1.join()

Действительно, если вы пишете код таким образом, join никогда не происходит из-за бесконечного цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...