Python的多任务/子过程
目前,我正在努力理解我带来怎样一个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()
处理下载/转换/后下载的东西放在一起第二个脚本似乎并没有被正确的方式^^
现在这是一个鸡和蛋的情况我...希望你能开导我...
回答:
Sanket Sudake的提示为我做了诡计!
我用芹菜与定义的任务我与异步式链接来处理我的定义的任务的帮助下调用任务管理器后,另一个(下载&转换& post_download-东西)的专用任务。
工作得非常好!
和芹菜有这么多的功能和技术进行实验! 但是对于我自定义的情况,任务的异步链工作正常,并且是我在这里的解决方案!
我添加了一个systemd-config来将其用作systemd可管理的守护进程服务。
以上是 Python的多任务/子过程 的全部内容, 来源链接: utcz.com/qa/260862.html