Python多个任务/子流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多个任务/子流程相关的知识,希望对你有一定的参考价值。

目前,我正在努力了解如何使用python脚本来执行多个任务。

对于这种情况,我将自己设定为目标:

制作一个带有URL的脚本,通过HTTP-GET传递,下载URL后面的视频,将其转换为mp3文件并执行一些“下载后的事情”,如设置mp3标签。这里的挑战应该是,在另一个下载/转换/后期下载过程处于活动状态时接受新的“下载请求”。

如果这种用法有意义,不应该是这个问题的重点(因为我知道已经有软件可用于实现视频到mp3的下载)。我只是想了解如何在执行其他任务(下载/转换/后期下载)时使用python来提供某个服务(httpd)。

首先,我尽量做到最基本。所以我决定使用BaseHttpServer和youtube-dl。 BaseHttpServer让我在我的脚本中提供和处理HTTP,youtube-dl管理下载/转换。处理后期下载操作是我的问题。

目前我能够接受多个“下载请求”并启动多个子进程',但是...如何在下载/转换完成后开始“下载后”(比如设置mp3-tags) 。因为我不知道如何获得特定文件上的下载/转换成功完成的信息。

到目前为止,这是我的代码

#!/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()一起处理下载/转换/后期下载 - 事情似乎不是正确的方式^^

现在这对我来说是鸡蛋和鸡蛋的情况...希望你能开导我...

答案

来自Sanket Sudake的小费为我做了诀窍!

我使用Celery作为具有已定义任务的任务管理器,我在异步链接的帮助下调用以在专用任务中处理我定义的任务(下载和转换以及post_download-stuff)。

效果非常好!

和芹菜有更多功能和技术可供试验!但对于我自己定义的情况,任务的异步链工作正常,这是我的解决方案!

我添加了一个systemd-config来使用它作为daemonized-service可管理systemd。

以上是关于Python多个任务/子流程的主要内容,如果未能解决你的问题,请参考以下文章

python并行编程

片段存储和重用:使用TabView的多个子片段

Python进程与线程

切换片段时如何维护子视图的状态?

PYTHON-进程 子进程

Activiti 多个并发子流程的应用