[英]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.