2017-12-18 135 views
1

目前,我正在努力理解我帶來怎樣一個python腳本執行多個任務一起給對方。Python的多任務/子過程

對於這種情況,我把我自己的目標:

做一個腳本,花了一個URL,通過通過一個HTTP-GET,下載URL後面的視頻,將其轉換成mp3文件並執行一些「下載後的東西」,如設置MP3標籤。這裏 的挑戰應該是接受新的「下載請求」 另一個下載/轉換/下載後處理是有效的。

如果這種用法是有道理與否,不應該是這個問題的要點(因爲我知道已經有可用的軟件來實現視頻到MP3的下載)。 我只是想了解在執行其他任務(下載/轉換/下載後)時如何使用python來服務某個服務(httpd)。

對於一開始,我試圖儘可能基礎。 所以我決定使用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可管理的守護進程服務。