Как вернуть результат процесса python3?
Я изучаю модуль multiprocessing.
from multiprocessing import Barrier, Process, SimpleQueue
def synchronize():
def send_order_buy_kick(synchronizer, q):
synchronizer.wait()
try:
id_1 = 1
print(id_1)
except Exception as ex:
q.put(ex)
def send_order_sell_kick(synchronizer, q):
synchronizer.wait()
try:
id_2 = 2
print(id_2)
except Exception as ex:
q.put(ex)
synchronizer = Barrier(2)
q = SimpleQueue()
p1 = Process(target=send_order_buy_kick, args=(synchronizer, q))
p2 = Process(target=send_order_sell_kick, args=(synchronizer, q))
p1.start()
p2.start()
p1.join()
p2.join()
if not q.empty():
raise q.get()
print(synchronize())
Код возвращает 2 1 None Как мне сделать так чтобы функция основная возвратила 1 и 2, причем сначала 1 а потом 2?
Ответы (1 шт):
Автор решения: kolyaskywalker
→ Ссылка
В вашем примере функция synchronize() ничего не возвращает, поэтому код print(synchronize()) печатает None. Во время выполнения synchronize() вызывает send_order_buy_kick() и send_order_sell_kick(), которые печатают 1 и 2 в произвольном порядке, т.к. выполняются в разных процессах.
Вы можете использовать multiprocessing.Lock(), чтобы процессы выполнялись в нужном порядке, и multiprocessing.Queue(), чтобы создать очередь процессов:
from multiprocessing import Process, Lock, Queue
def send_order_buy_kick(lock, lst):
with lock:
id_1 = 1
lst.put(id_1)
def send_order_sell_kick(lock, lst):
with lock:
id_2 = 2
lst.put(id_2)
def synchronize():
lock = Lock()
queue = Queue()
p1 = Process(target=send_order_buy_kick, args=(lock, queue))
p2 = Process(target=send_order_sell_kick, args=(lock, queue))
p1.start()
p2.start()
p1.join()
p2.join()
result = list()
while queue.empty() is False:
result.append(queue.get())
return result
if __name__ == '__main__':
print(*synchronize()) # 1 2