Мультиобработка с подпроцессом, Python и PSQL - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть 100 мест, которые я пытаюсь обработать.Каждое местоположение требует одного и того же рабочего процесса, поэтому я разработал набор сценариев для этого.

Во-первых, я делаю некоторые подготовительные файлы в Python.Этот первый код Python затем вызывает другой (второй) скрипт Python, используя подпроцесс.Этот второй Python вызывает модули и выполняет некоторые подпрограммы перед повторным вызовом подпроцесса для запуска набора команд PSQL.

Как только первый скрипт Python вызывает вторую, он может свободно запускаться в следующем месте.Прямо сейчас я разрешаю запускать 5 экземпляров второго Python:

for x, every in enumerate(location):
   .... (PREP CODE)
   if x == 0:
      process = subprocess.Popen(command, shell=True)
   elif x == 1:
      process1 = subprocess.Popen(command, shell=True)
   elif x == 2:
      process2 = subprocess.Popen(command, shell=True)
   elif x == 3:
      process3 = subprocess.Popen(command, shell=True)
   elif x == 4:
      process4 = subprocess.Popen(command, shell=True)

while process.poll() is None:
    time.sleep(0.5)
while process1.poll() is None:
    time.sleep(0.5)
while process2.poll() is None:
    time.sleep(0.5)
while process3.poll() is None:
    time.sleep(0.5)
while process4.poll() is None:
    time.sleep(0.5)

Я не использую PIPE или stdout, поскольку он, кажется, блокирует последовательные вызовы подпроцесса.Внутри второго питона я выполняю кучу обработок и затем вызываю:

def execute_psql(code):
    command = 'psql -f %s "host=postgres.local dbname=projects user=david password=XXXXX port=5432"' % (codespace + '\\codes\\' + str(i) + code + '.sql')
    process = subprocess.Popen(command, shell=True)
    while process.poll() is None:
        time.sleep(0.5)

Это вызывается примерно 15 раз из-за количества отдельных сценариев PSQL, которые мне нужно запустить.

Когда я запускаю этот набор кодов в 1 месте, он запускается и успешно завершается через 3 часа.Когда я бегу даже с двумя локациями, время резко возрастает, и я рискну сказать, что останавливается для большинства процессов.Сейчас я тестирую 2 одновременно.30% сценариев PSQL были успешно выполнены для одного местоположения и 90% для другого.Текущая версия PSQL работает 6 и 20 часов соответственно.

Что может быть причиной того, что код просто так зависает?Я нахожусь в процессе тестирования (например, (1) изменить оболочку = True на оболочку = False; например (2) переименовать все переменные, включая «process», в уникальное имя переменной).

В базе данныхсторона: код, который до 20 часов, только для чтения (с htop status = R) и использует 100% ЦП на одном ядре.6-часовой код использует процессор 3% и находится в состоянии D (или непрерывный режим сна).

1 Ответ

0 голосов
/ 14 декабря 2018

Распараллеливание трудно сделать правильно.Если порядок расположения не имеет значения, может быть проще создать однопотоковую программу, которая обрабатывает одно местоположение, а затем распараллелить это с помощью внешнего инструмента, такого как GNU Parallel:

parallel python process_one_location.py ::: location1 location2 location3 .. locationN
...