簡體   English   中英

Python線程未返回值

[英]Python Thread not returning the value

使用: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重定向回到另一個視圖,並調用processVideo,但是由於某種原因,創建的線程(process_video)不等待媒體服務器的輸出。

我不會依賴在Web應用程序中正確執行的線程。 根據Web服務器的MPM,執行請求的過程可能會在請求完成后被殺死(我想)。

我建議同步發出媒體服務器請求,但讓媒體服務器在開始編碼后立即返回而不會出現問題(如果您可以控制其源代碼)。 然后,后台進程(或cron)可以定期輪詢結果。 這只是一種解決方案-您應該提供有關基礎結構的更多信息(例如,您是否控制媒體服務器?)。

還請檢查另一個問題的注釋中的重復項,以獲取有關在這種情況下使用任務隊列的一些答案。

順便說一句,我假設后台線程中沒有異常發生?!

這是我為解決所面臨的問題所做的事情。

我使用django活塞創建了一個API,用於使用以GET形式傳遞的參數來調用processvideo,當我嘗試以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正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM