2017-12-18 21 views
1

지금은 파이썬 스크립트를 가져 와서 여러 태스크를 수행하는 방법을 이해하는 데 어려움을 겪고 있습니다.파이썬 다중 태스크/서브 프로세스

에 의해 전달 된 URL을했다 스크립트를 만들 HTTP를-GET은 URL 뒤에 비디오를 다운로드, mp3 파일 파일로 변환 및 수행이 경우를 들어

, 나는 내 스스로 목표를 설정 mp3 태그 설정과 같은 "다운로드 후 작업" 다른 다운로드/변환/다운로드 후 프로세스가 활성화되어 있지만 새로운 "다운로드 요청"을 수락하려면 여기에 도전해야합니다.

이 사용법이 의미가있는 경우,이 질문의 요점이되어서는 안됩니다 (비디오 - mp3 다운로드를 달성하는 데 이미 사용 가능한 소프트웨어가 있으므로). 다른 작업 (다운로드/변환/다운로드 후)을 수행하는 동안 특정 서비스 (httpd)를 제공하기 위해 Python을 사용하는 방법을 이해하려고합니다.

처음에는 가능한 한 기본적으로 노력했습니다. 그래서 BaseHttpServer와 youtube-dl을 사용하기로 결정했습니다. BaseHttpServer는 내 스크립트에서 HTTP를 처리하고 처리하도록하고 youtube-dl은 다운로드/변환을 관리합니다. 다운로드 후 작업 처리는 내 문제입니다.

지금은 여러 개의 "다운로드 요청"을 받아들이고 여러 개의 하위 프로세스를 시작할 수 있지만 ... 다운로드 한 후 "다운로드 후"작업 (예 : mp3 태그 설정)을 시작하려면 어떻게해야합니까?/변환이 완료되었습니다. 이후 특정 파일에 대한 다운로드/변환이 성공적으로 완료되었음을 알 수있는 실마리가 없습니다. 여기

지금까지

#!/usr/bin/env python 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import SocketServer 
import subprocess 

class S(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     # set youtube-dl command and arguments 
     args = ['youtube-dl', '--extract-audio', '--audio-format', 'mp3', '--output', '%(title)s.%(ext)s', '--no-playlist', '--quiet'] 

     # building HTTP Header and extract path from it 
     self._set_headers() 
     passed = self.path  # catch the passed url 
     url = passed[1:]  # cutoff leading/

     if url: 
      # append the url as the last argument to args 
      args.append(url) 
      # download 
      subprocess.Popen(args) 
     else: 
      print('empty request') 

def run(server_class=HTTPServer, handler_class=S, port=8000): 
    server_address = ('', port) 
    httpd = server_class(server_address, handler_class) 
    print 'Starting httpd...' 
    httpd.serve_forever() 

if __name__ == "__main__": 
    from sys import argv 

    if len(argv) == 2: 
     run(port=int(argv[1])) 
    else: 
     run() 

이 비디오를 다운로드하고 다른 다운로드 요청을받을 때, MP3로 저장하는 저를 가능하게 내 코드입니다,하지만 난 파일 에 추가 작업을 수행 할 수 모른다 이후에 다운로드되었으므로 이고은 새 다운로드/변환을 수락하고 시작합니다.

subprocess.call()을 사용하고 youtube-dl이 끝날 때까지 기다리면 현재 다운로드와 다른 방식으로 다운로드 할 수 있습니다.

내가 함께/후 다운로드-일을 변환/다운로드를 처리 할 수 ​​.Popen()로 시작하는 두 번째 스크립트를 작성하는 것은 올바른 방법 ^^ 될 것 같지 않습니다

지금이는 닭고기와 계란 상황입니다 나 ... 당신이 나를 계몽 할 수 있기를 희망한다. ...

+0

HTTP 시간 초과를 쉽게 맞출 수있는 충분한 처리를하고 있습니다. [셀러리] (http://www.celeryproject.org/)와 같은 일부 작업 관리자를 사용하여이 워크 플로를 처리하는 것이 좋습니다. 셀러리를 사용하면 워크 플로우를 훨씬 잘 처리 할 수 ​​있으며 여러 프로세스를 보유하거나 관리 할 필요가 없습니다. –

+0

답변을 주셔서 감사합니다 ... 나는 그 사실을 몰랐습니다. 나는 이것이 정말로 좋고 견고한 것처럼 보이기 때문에 셀러리를 보게 될 것입니다! - 그러나 나는 아직도 다른 의견과 아이디어를 위해 열려 있습니다! – rohr

답변

0

Sanket Sudake로부터의 팁은 나에게 트릭을했다!

나는 전용 작업에 또 다른 후 (&는 & post_download-물건을 변환 다운로드) 내가 비동기 체인 내 정의 된 작업을 처리 할 수의 도움으로 전화를 정의 작업과 작업 관리자로 셀러리를 사용합니다.

꽤 잘 작동합니다!

셀러리에는 다양한 기능과 실험 기법이 있습니다! 하지만 내 자체 정의 된 경우 작업의 비동기 체인이 제대로 작동하고 여기에 대한 솔루션입니다!

systemd-config를 systemd로 관리 가능한 daemonized-service로 사용하기 위해 추가했습니다.