目前,我正在努力理解我帶來怎樣一個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()
處理下載/轉換/後下載的東西放在一起第二個腳本似乎並沒有被正確的方式^^
現在這是一個雞和蛋的情況我...希望你能開導我...
您正在做足夠的處理,您可以輕鬆地點擊HTTP超時。我建議你使用像[芹菜](http://www.celeryproject.org/)這樣的任務管理器來處理這個工作流程。您可以使用芹菜更好地處理您的工作流程,而且您不需要擁有或管理多個流程。 –
謝謝你的回答......我並沒有意識到這一點。我一定會看看芹菜,因爲這看起來像一個非常好的和堅實的東西! - 但我仍然願意接受其他意見和想法! – rohr