Основная идея здесь должна заключаться в передаче не фактических аргументов, а канала связи. Для односторонней связи (передача новых аргументов) используйте 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