связь между двумя мультипроцессорами в режиме реального времени - PullRequest
2 голосов
/ 23 апреля 2020

У меня 2 обработки, мне нужно, чтобы когда что-то происходило с одним процессом, что-то происходило с другим. Например:

import multiprocessing


def function_1(num):
    while True:
        status = False
        for i in range (num):
            if i == 100:
                status = True
            i +=1


def function_2():
    while True:
        if status == True:
            print("status changed")

if __name__ == '__main__':
    num = 101
    a = multiprocessing.Process(target=function_1,args=(num,))
    b = multiprocessing.Process(target=function_2)


    a.start()
    b.start()


    a.join()
    b.join()

Этот код, очевидно, не работает, как я могу заставить его работать? Мне не нужен один процесс, чтобы завершить и затем получить результат, мне нужно, чтобы процесс продолжался после этого ... Есть ли способ сделать это?

спасибо!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Вместо использования общей переменной с целью заставить function_2 ждать, пока function_1 не достигнет определенного состояния, вы можете создать экземпляр multiprocessing.Queue для передачи обеим функциям и воспользоваться тем фактом, что Queue.get блокируется до тех пор, пока очередь не получит что-то для удаления из очереди, и не заставит function_1 поместить что-либо в очередь, как только она достигнет желаемого состояния:

import multiprocessing

def function_1(queue, num):
    while True:
        for i in range(num):
            print(i)
            if i == 3:
                queue.put(None)

def function_2(queue):
    queue.get()
    print('do something')

if __name__ == '__main__':
    num = 5
    queue = multiprocessing.Queue()
    a = multiprocessing.Process(target=function_1, args=(queue, num))
    b = multiprocessing.Process(target=function_2, args=(queue,))
    a.start()
    b.start()
1 голос
/ 23 апреля 2020

Вы забыли добавить .join() после start(). Попробуйте это:

a.start()
b.start()

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