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多个任务/子流程的主要内容,如果未能解决你的问题,请参考以下文章