使用:Django with 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重定向回另一个视图并调用processVideo,但由于某种原因,创建的线程(process_video)不等待媒体服务器的输出。
答案 0 :(得分:0)
我不会依赖在Web应用程序中正确执行的线程。根据Web服务器的MPM,执行请求的进程可能会在请求完成后被终止(我猜)。
我建议同步进行媒体服务器请求,但让媒体服务器在开始编码后立即返回(如果您可以控制其源代码)。然后,后台进程(或cron)可以定期轮询结果。这只是一个解决方案 - 您应该提供有关基础架构的更多信息(例如,您是否控制媒体服务器?)。
另请查看another question注释中的重复项,以获取有关在这种情况下使用任务队列的一些答案。
BTW我假设后台线程中没有异常发生?!
答案 1 :(得分:0)
这就是我为解决我面临的问题所做的事情。
我使用django活塞来创建一个API,用于调用processvideo并将参数传递为GET,当我尝试将参数作为POST发送时,我收到了403 CSRF错误。 从createVideo函数我这样调用API cmd =“curl \”%s / api / process_video /?video_id =%s& fileURI =%s& video_title =%s \“> / dev / null 2>& 1&” %(settings.SITE_URL,str(video_id),urllib.quote(fileURI),urllib.quote(video_title))
这很有效。 我觉得如果我可以让session_id和post参数起作用会有所帮助。不知道如何让csrf工作起作用。