Python Thread没有返回值

时间:2010-11-22 06:11:10

标签: python django django-views

使用: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)不等待媒体服务器的输出。

2 个答案:

答案 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工作起作用。