Skip to main content
 首页 » 编程设计

Python 线程不返回值

2025年05月04日11落叶无声

使用: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 中的重复项对有关在这种情况下使用任务队列的一些答案的评论。

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