Поток Python не возвращает значение - PullRequest
2 голосов
/ 22 ноября 2010

Использование: 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) не ожидает вывода с медиа-сервера.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Вот что я сделал, чтобы обойти проблему, с которой столкнулся.

Я использовал django поршень для создания API для вызова видео процесса с параметрами, переданными как GET, я получал ошибку CSRF 403, когда пытался отправить параметры как POST. и из функции 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 для работы. Не уверен, как я мог заставить эту штуку ссрф работать ...

0 голосов
/ 22 ноября 2010

Я бы не стал полагаться на то, что потоки правильно выполняются в веб-приложениях. В зависимости от MPM веб-сервера процесс, выполняющий запрос, может быть прерван после выполнения запроса (я полагаю).

Я бы порекомендовал сделать запрос медиа-сервера синхронно, но пусть медиа-сервер возвращается сразу после того, как он без проблем запустил кодирование (если у вас есть контроль над его исходным кодом). Затем фоновый процесс (или cron) может регулярно запрашивать результат. Это только одно решение - вам следует предоставить больше информации о вашей инфраструктуре (например, вы управляете медиасервером?).

Также проверьте дубликаты в комментариях к другому вопросу , чтобы найти ответы на некоторые вопросы об использовании очередей задач в таком сценарии.

Кстати, я предполагаю, что в фоновом потоке нет исключений?!

...