Передача выходных данных процесса Python A (создание документов) другому процессу Python B (вставка документов в базу данных, например Mon go) - PullRequest
0 голосов
/ 30 января 2020

Это может быть глупый вопрос. Но я ищу эффективный способ решения проблемы Pythoni c.

У меня есть process A, который продолжает создавать некоторые документы (сложный процесс вычислений).

Мне нужно запустить process B потреблять вывод из A (либо в виде одного do c, либо в виде пакета документов) и вставить его в MongoDB. (batch is preferable).

Какой самый эффективный способ передачи трубопровода от А до Б. Является ли трубопровод здесь наилучшим подходом?

Я могу подождать, пока завершится А, а затем начнется В. Но я чувствую, что это не эффективно.

1 Ответ

0 голосов
/ 30 января 2020

tl; dr: использовать многопроцессорность

Звучит так, что A может занять> 10 раз больше времени, чем B. Если так, то просто используйте check_output . Пусть B терпеливо подождет, пока ребенок A отправит документ на стандартный вывод, затем вставит документ в БД.

В качестве альтернативы, возможно, A & B займет сравнимое количество времени, и пакетирование желательно. У вас есть куча заданий A, записывающих в /tmp/temp.${PID}, затем mv (os.rename()) готовый файл в каталог /tmp/out/. Пусть B периодически помещает такие файлы в БД, отсекая каждый из них по ходу.

В любом случае, вы будете жевать множество циклов ЦП, поскольку ваш for l oop посещает множество входов, и вы хотел бы занять больше чем одно ядро. Введите многопроцессорность.

Преобразуйте ваш for l oop в map вызов, например: list(map(str, range(3))) превратит [0, 1, 2] в ['0', '1', '2']. Конечно, ваша функция будет гораздо более интенсивной, чем str.

Имея это в руках, вы в хорошей позиции, чтобы раскошелиться на группу детей, которые будут все запустить ту же функцию:

    with multiprocessing.Pool() as p:
        p.map(my_func, bunch_of_inputs)
...