Асинхронные фоновые процессы в Python?

Я использовал это в качестве ссылки, но не способный выполнить точно, в чем я нуждаюсь: Вызов внешней команды в Python

Я также читал это: http://www.python.org/dev/peps/pep-3145/

Для нашего проекта у нас есть 5 svn контроля, который должен обновить, прежде чем мы сможем развернуть наше приложение. В моей dev среде, где быстрое развертывание немного более важно для производительности, чем производственное развертывание, я работал над ускорением процесса.

У меня есть сценарий удара, который работал прилично, но имеет некоторые ограничения. Я разжигаю несколько 'svn обновления' со следующей командой удара:

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &

Они все работают параллельно, и это работает вполне прилично. Я также использую этот шаблон в остальной части сценария сборки для того, чтобы исчерпать каждую сборку муравья, затем перемещая войны в Tomcat.

Однако я не имею никакого контроля над останавливающимся развертыванием, если одно из обновлений или сборки перестало работать.

Я переписываю свой сценарий удара с Python, таким образом, я имею больше контроля над ответвлениями и процессом развертывания.

Я использую subprocess.call () для исчерпывания 'svn, обновляют/repo' команды, но каждый действует последовательно. Я пробую' (svn, обновляют/repo), и', и они исчерпывают, но код результата сразу возвращается. Таким образом, у меня нет способа определить, перестала ли конкретная команда работать или не в асинхронном режиме.

import subprocess

subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )

Я хотел бы найти, что способ иметь Python исчерпывает каждую команду Unix, и если какой-либо из вызовов приводит к сбою когда-либо все остановки сценария.

11
задан Community 23 May 2017 в 12:26
поделиться

1 ответ

Не используйте shell = True . Для вызова вашей программы svn излишне будет вызывать оболочку, и это даст вам код возврата оболочки вместо svn.

repos = ['/repo1', '/repo2', '/repo3']
# launch 3 async calls:
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos]
# wait.
for proc in procs:
    proc.wait()
# check for results:
if any(proc.returncode != 0 for proc in procs):
    print 'Something failed'
18
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: