У меня есть 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 (или непрерывный режим сна).