使用:Django 与 Python
总体目标:调用处理视频转换的函数(在内部向媒体服务器发出 curl 命令)并应立即返回给用户。
使用消息队列对应用程序来说是一种矫枉过正。 所以我决定使用线程,我写了一个类来覆盖 init 和 run 方法并调用 curl 命令
class process_video(Thread):
def __init__ (self,video_id,video_title,fileURI):
Thread.__init__(self)
self.video_id = video_id
self.video_title = video_title
self.fileURI = fileURI
self.status =-1
def run(self):
logging.debug("FileURi" + self.fileURI)
curlCmd = "curl --data-urlencode \"fileURI=%s\" %s/finalize"% (self.fileURI, settings.MEDIA_ROOT)
logging.debug("Command to be executed" + str(curlCmd))
#p = subprocess.call(str(curlCmd), shell=True)
output_media_server,error = subprocess.Popen(curlCmd,stdout = subprocess.PIPE).communicate()
logging.debug("value returned from media server:")
logging.debug(output_media_server)
然后我从另一个名为 createVideo 的函数中实例化此类 像这样调用 success = process_video(video_id, video_title, fileURI)
问题: 用户从 createVideo 重定向回另一个 View 并调用 processVideo,但是由于某种原因,创建的线程 (process_video) 不等待媒体服务器的输出。
请您参考如下方法:
我不会依赖线程在 Web 应用程序中的正确执行。根据 Web 服务器的 MPM,执行请求的进程可能会在请求完成后被终止(我猜)。
我建议同步发出媒体服务器请求,但让媒体服务器在开始编码后立即返回而没有问题(如果您可以控制其源代码)。然后后台进程(或 cron)可以定期轮询结果。这只是一种解决方案 - 您应该提供有关您的基础架构的更多信息(例如,您控制媒体服务器吗?)。
还要检查 another question 中的重复项对有关在这种情况下使用任务队列的一些答案的评论。
顺便说一句,我假设后台线程没有发生异常?!
