Как вернуть результат процесса 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

→ Ссылка