Как динамически изменять аргументы процесса в многопроцессорной обработке, используя python - PullRequest
1 голос
/ 17 июня 2020

У меня есть код, который порождает два процесса, и процессы запускают функцию, принимающую 2 аргумента. Я хочу проверять условие, скажем, каждые 0,1 секунды и изменять аргументы целевой функции обоих процессов без необходимости убивать и перезапускать процесс. Как мне это сделать?

def func(arg1,arg2):
    #do something
main():
    p1 = multiprocessing.Process(target=func, args=(arg1,arg2))
    p2 = multiprocessing.Process(target=func, args=(arg1,arg2))
    p1.start()
    p2.start()
    p1.join()
    p2.join()



1 Ответ

0 голосов
/ 17 июня 2020

Основная идея здесь должна заключаться в передаче не фактических аргументов, а канала связи. Для односторонней связи (передача новых аргументов) используйте Queue. Для двунаправленной связи (передача аргументов и получение результатов) используйте Pipe. Для получения дополнительной информации см .: https://docs.python.org/2/library/multiprocessing.html#exchanging -объекты между процессами

Следуя вашему примеру кода, это может выглядеть примерно так:

import multiprocessing
import time

def func(queue):
    while True:
        arg1, arg2 = queue.get()
        print(arg1, " ", arg2)    # sample usage

# create queues and pass them to your function
q1 = multiprocessing.Queue()
q2 = multiprocessing.Queue()
p1 = multiprocessing.Process(target=func, args=(q1,))
p2 = multiprocessing.Process(target=func, args=(q2,))
p1.start()
p2.start()

# sample arguments
args = [
    ("arg1.1", "arg1.2"),
    ("arg2.1", "arg2.2"),
    ("arg3.1", "arg3.2"),
    ("arg4.1", "arg4.2"),
    ("arg5.1", "arg5.2"),
    ("arg6.1", "arg6.2"),
]

# Here you would likely have your own way to generate new arguments.
for arg1, arg2 in args:
    q1.put((arg1, arg2))
    q2.put((arg1, arg2))
    time.sleep(1)

# Since the processes now run indefinitly, you have to kill them.
# Alternitively you could send them a stop signal and let them return.
p1.kill()
p2.kill()

Queue.get() по умолчанию является блокирующим вызовом, то есть он ждет, пока не будет доступен результат: https://docs.python.org/3/library/queue.html#queue .Queue.get

...