복붙노트

[PYTHON] 파이썬에서 비동기 백그라운드 프로세스?

PYTHON

파이썬에서 비동기 백그라운드 프로세스?

이 참조로 사용하고 있지만 정확히 내가 무엇을 달성 할 수 없습니다 : Python에서 외부 명령 호출

나도 이것을 읽고 있었다 : http://www.python.org/dev/peps/pep-3145/

우리 프로젝트에는 5 개의 svn 체크 아웃이 있습니다. 업데이트는 응용 프로그램을 배포하기 전에 업데이트해야합니다. 빠른 배포가 생산 배포보다 생산성 측면에서 더 중요한 내 개발 환경에서는 프로세스 속도를 높이기 위해 노력해 왔습니다.

나는 잘 작동하지만 약간의 제한이있는 bash 스크립트를 가지고있다. 나는 다음과 같은 bash 명령으로 여러 개의 'svn updates'를 실행한다.

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

이들은 모두 병렬로 실행되며 꽤 잘 작동합니다. 또한 나머지 개작 스크립트에서이 패턴을 사용하여 각 개미 빌드를 실행 한 다음 전쟁을 Tomcat으로 옮깁니다.

그러나 업데이트 나 빌드 중 하나가 실패 할 경우 배포를 중지 할 수 없습니다.

필자는 bash 스크립트를 파이썬으로 다시 작성하므로 브랜치와 배포 프로세스를보다 잘 제어 할 수 있습니다.

Subprocess.call ()을 사용하여 'svn update / repo'명령을 실행하지만 각 명령은 순차적으로 작동합니다. 나는 (svn update / repo) & '시도하고 그 모든 화재,하지만 결과 코드는 즉시 반환합니다. 따라서 비동기 모드에서 특정 명령이 실패했는지 여부를 판단 할 방법이 없습니다.

import subprocess

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

각 Unix 명령에서 파이썬을 실행하는 방법을 찾고, 언제든지 호출이 실패하면 전체 스크립트가 중지됩니다.

해결법

  1. ==============================

    1.shell = True를 사용하지 마십시오. 불필요하게 쉘을 호출하여 svn 프로그램을 호출하면 svn 대신 쉘의 리턴 코드를 얻을 수 있습니다.

    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'
    
  2. from https://stackoverflow.com/questions/2496772/asynchronous-background-processes-in-python by cc-by-sa and MIT license