DrL*_*zer 7 python external-process web
我有一个在我的Web服务器上运行的python脚本.然后调用main函数,当它返回时,它只是休眠几秒钟并再次被调用.它的目的是获取用户添加的任何新上传的视频并将其转换为webm,将中间帧作为图像和一堆其他时髦的东西拉出来.我正在使用外部调用ffmpeg.下面的代码片段显示了我如何调用它.
duration = output[durationIndex+10:durationIndex+18]
durationBits = duration.split(":")
lengthInSeconds = (int(durationBits[0])*60*60) + (int(durationBits[1])*60) + (int(durationBits[2]))
child = subprocess.Popen(["ffmpeg","-y","-i",sourceVideo,"-f","mjpeg","-vframes","1","-ss",str(lengthInSeconds/2),destination], shell=True, stderr=subprocess.PIPE)
output = ""
while True:
out = child.stderr.read(1)
if out == '' and child.poll() != None:
break
if out != '':
output += out
updateSQL = "update `videos_graduatevideo` set thumbnail = '" + str(destination) + "' where `original_video` = '" + sourceVideo + "'"
cursor.execute(updateSQL)
Run Code Online (Sandbox Code Playgroud)
这个脚本在Windows机器上运行,但我可能会在开发完成时将它部署在Unix系统上.
问题是.我需要这个python脚本来继续运行.如果ffmpeg出现问题并且我的脚本挂起,用户上传的视频将处于"挂起"状态,直到我开始查看python脚本.我知道某个mov文件让ffmpeg无限期挂起.在某种程度上,我可以检查一个进程运行了多长时间,然后如果它运行了太长时间就将其终止?
我同意S. Lott的看法,看起来你会因为你的架构考虑MQ而受益,但对于这个特殊问题,我认为你对Popen的使用是可以的.
对于您创建的每个进程,保存创建时间(类似datetime.datetime.today()就足够了).然后每隔一分钟就会查看打开的进程和时间列表,并使用Popen.send_signal(signal),terminate()或kill()获取那些不应该存在的进程和时间.
例:
import time
from subprocess import Popen
from datetime import datetime
jobs = []
max_life = 600 # in seconds
def reap_jobs(jobs):
now = datetime.datetime.today()
for job in jobs:
if job[0] < now - datetime.timedelta(seconds=max_life)
job[1].kill()
# remove the job from the list if you want.
# but remember not to do it while iterating over the list
for video in list_of_videos:
time = datetime.datetime.today()
job = Popen(...)
jobs.append((time,child))
while True:
reap_jobs(jobs)
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1812 次 |
| 最近记录: |