Многопроцессорная обработка Python - PullRequest
5 голосов
/ 22 июня 2011

Этот вопрос является скорее процессом поиска фактов и размышлений, чем ориентированным на код.

У меня есть много скомпилированных программ на C ++, которые мне нужно запускать в разное время и с разными параметрами. Я смотрю на использование многопроцессорной обработки Python для чтения задания из очереди заданий (rabbitmq), а затем передаю его в программу C ++ для запуска (возможно, в подпроцесс). Я смотрел на многопроцессорный модуль, потому что он все будет работать на двухсерверном сервере Xeon, поэтому я хочу в полной мере использовать возможности многопроцессорного сервера.

Программа Python будет центральным менеджером и будет просто читать задания из очереди, порождать процесс (или подпроцесс?) С помощью соответствующей программы C ++ для запуска задания, получать результаты (подпроцесс stdout & stderr), передавать их к обратному вызову и поместите процесс обратно в очередь процессов, ожидающих запуска следующего задания.

Во-первых, это звучит как правильная стратегия?

Во-вторых, есть ли примеры подобных вещей?

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 22 июня 2011

Программа Python будет центральный менеджер и просто прочитал бы задания из очереди, порождают процесс (или подпроцесс?) с соответствующим C ++ программа для запуска работы, получить результаты (подпроцесс stdout & stderr), кормить это к обратному вызову и положить процесс обратно в очереди процессов в ожидании следующего задания.

Для этого вам не нужен модуль multiprocessing. Модуль multiprocessing подходит для запуска функций Python как отдельных процессов. Чтобы запустить программу на C ++ и прочитать результаты из stdout, вам понадобится только модуль subprocess. Очередь может быть списком, и ваша программа на Python будет просто зацикливаться, пока список не пуст.


Однако, если вы хотите

  1. порождает несколько рабочих процессов
  2. чтобы они читали из общей очереди
  3. использовать аргументы из очереди для программы spawn на C ++ (параллельно)
  4. использовать вывод программ на C ++ поставить новые предметы в очередь

тогда вы могли бы сделать это с multiprocessing, как это:

test.py

import multiprocessing as mp
import subprocess
import shlex

def worker(q):
    while True:
        # Get an argument from the queue
        x=q.get()

        # You might change this to run your C++ program
        proc=subprocess.Popen(
            shlex.split('test2.py {x}'.format(x=x)),stdout=subprocess.PIPE)
        out,err=proc.communicate()

        print('{name}: using argument {x} outputs {o}'.format(
            x=x,name=mp.current_process().name,o=out))

        q.task_done()

        # Put a new argument into the queue
        q.put(int(out))

def main():
    q=mp.JoinableQueue()

    # Put some initial values into the queue
    for t in range(1,3):
        q.put(t)

    # Create and start a pool of worker processes
    for i in range(3):
        p=mp.Process(target=worker, args=(q,))
        p.daemon=True
        p.start()
    q.join()
    print "Finished!"

if __name__=='__main__':
    main()

test2.py (простая замена вашей программе на C ++):

import time
import sys

x=int(sys.argv[1])
time.sleep(0.5)
print(x+3)

Запуск test.py может привести к примерно так:

Process-1: using argument 1 outputs 4
Process-3: using argument 3 outputs 6
Process-2: using argument 2 outputs 5
Process-3: using argument 6 outputs 9
Process-1: using argument 4 outputs 7
Process-2: using argument 5 outputs 8
Process-3: using argument 9 outputs 12
Process-1: using argument 7 outputs 10
Process-2: using argument 8 outputs 11
Process-1: using argument 10 outputs 13

Обратите внимание, что числа в правом столбце возвращаются в очередь и (в конечном итоге) используются в качестве аргументов для test2.py и отображаются в виде чисел в левом столбце.

1 голос
/ 22 июня 2011

Во-первых, похоже ли это на действительную стратегию?

Да.

Во-вторых, есть ли примеры того, что похоже на это?

Сельдерей

0 голосов
/ 22 июня 2011

Звучит как хорошая стратегия, но вам не нужен модуль multiprocessing, а модуль subprocess. subprocess предназначен для запуска дочерних процессов из программы Python и взаимодействия с ними (stdio, stdout, pipe и т. Д.), В то время как multiprocessing больше о распространении кода Python для запуска в нескольких процессах для получения производительность через параллелизм.

В зависимости от стратегии реагирования, вы можете также захотите посмотреть threading для запуска подпроцессов из потока. Это позволит вам подождать в одном подпроцессе, оставаясь при этом в очереди для принятия других заданий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...