2010-11-22 212 views
2

使用呼叫它处理视频转换(内部使得curl命令向媒体服务器),应立即返回到用户的功能。Python的线程没有返回值

使用消息队列会对应用程序造成过大的影响。 所以我决定使用线程,我写这将覆盖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

我需要一些更多的信息在这里。使用'process_video'的代码是什么样的?我假设你做的不仅仅是创建'process_video'的实例。 – Arlaharen 2010-11-22 06:52:40

+0

添加'stderr = PIPE'并记录'error'。 – jfs 2010-11-22 07:47:59

+0

subprocess.Popen调用似乎卡住了,因为它似乎没有记录任何错误或输出。我也检查了媒体服务器日志,并且没有对它进行调用。将process_video的实例设置为守护进程也无济于事。有任何想法吗? – 2010-11-22 14:20:06

回答

0

我不会依赖web应用程序中正确执行的线程。根据Web服务器的MPM,执行请求的进程可能会在请求完成后终止(我猜)。

我建议同步制作媒体服务器请求,但让媒体服务器在启动编码后立即返回而没有问题(如果您可以控制其源代码)。然后后台进程(或cron)可以定期轮询结果。这只是一个解决方案 - 您应该提供有关您的基础设施的更多信息(例如,您是否控制媒体服务器?)。

此外,请检查another question的注释中的重复内容,以获取有关在这种情况下使用任务队列的一些答案。

顺便说一句我假设后台线程没有发生异常?!

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 > “%(settings.SITE_URL,STR(VIDEO_ID),urllib.quote(fileURI所),urllib.quote(VIDEO_TITLE))

和这个工作。 我觉得这会有帮助,如果我能得到session_id和发布参数的工作。不知道我怎么能摆脱那个csrf的东西来工作。