2017-12-18 7 views
1

瞬間、私はお互いに沿って複数のタスクを実行するのpythonスクリプトをもたらすかを理解するために苦労しています。Pythonの複数のタスク/サブプロセス

から渡された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()を使用し、ユーチューブ-DLは、別のダウンロードを受け入れ、現在に平行するオプションを破る完了するまで待ちます。

と一緒に、私はダウンロードを処理するために.Popen()で始まる2番目のスクリプト/変換/ポストダウンロード-ものを書くことは今のところ、これがために鶏と卵の状況で正しい方法^^

ではないようです私は... Sanket Sudakeから

+0

HTTPタイムアウトを簡単に突き止めることができる十分な処理を行っています。 [celery](http://www.celeryproject.org/)のようなタスクマネージャを使用してこのワークフローを処理することをお勧めします。セロリでワークフローをはるかに良く扱うことができ、複数のプロセスを管理する必要はありません。 –

+0

答えに感謝します...私はそれを認識していませんでした。私は間違いなくこれは本当に良いと固体のように見えるセロリを見ている! - しかし私はまだ他のコメントやアイデアのために開いています! – rohr

答えて

0

先端が私のためのトリックをした...あなたは私を啓発することを願って!

私は定義タスクを処理するために非同期チェーンの助けを借りて呼び出す定義タスクをタスクマネージャーとして使用します(& &変換後のpost_download-stuffをダウンロードしてください)。

かなりうまく動作します!

とセロリはSO MUCH MORE機能とを実験する技術を持っています! しかし、私の自己定義のケースでは、タスクの非同期チェーンがうまく動作し、私の解決策です!

これをsystemdで管理可能なdaemonized-serviceとして使用するためにsystemd-configを追加しました。