2017-12-18 136 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可管理的守护进程服务。