Запуск потока даже после завершения основного потока с помощью Django - PullRequest
0 голосов
/ 20 июля 2011

Я работаю над проектом django, в котором пользователь нажимает и отправляет кучу изображений, которые должны быть обработаны в бэкэнде.

Изображения уже загружены на сервер, но как только пользователь нажимает на кнопку отправить,обработка запроса занимает много времени и около 15 секунд до тех пор, пока не появится сообщение «Спасибо, что используете нас».

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

def processJob(request):
    ...
    threading.Thread(target=processInBackground, args=(username, jobID)).start()
context = {}
context.update(csrf(request))
return render_to_response('checkout.html', context)

def processInBackground(username, jobID):
...
    (processing the rest of the job)

Тем не менее, как только я запускаю его: он создает новый поток, но он завершает секунды, в которых основной поток завершает работу.Есть ли способ, как я могу обработать вещи в бэкэнде, пока пользователь сразу получает сообщение с благодарностью?

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

Это не обязательно то, что вы ищете, но на платформе моего веб-сайта фотографа мы загружаем фотографию асинхронно, используя Javascript (с PLUpload), что позволяет нам иметь обратные вызовы для нескольких статусов загрузки фотографий одновременно.После загрузки файл сохраняется в папку с уникальным именем, а также в очередь базы данных, где он затем выбирается заданием cron, которое просматривает очередь для всего, что еще не завершено, и обрабатывает его.Я использую пользовательские команды управления Django, поэтому я получаю все преимущества инфраструктуры Django, за исключением веб-части.

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

0 голосов
/ 20 июля 2011
PROCESSORS = [] # empty list of background processors

Наследование от Trheading.thread

class ImgProcessor(threading.Thread):
    def __init__(self, img, username, jobID):
        self.img = img
        self.username = username
        self.jobID = jobID
        threading.Thread.__init__(self)
        self.start()
        self.readyflag = False

    def run(self):
        ... process the image ...
        self.readyflag = True

Затем при получении запроса:

def processJob(request):
    PROCESSORS.append(ImgProcessor(img, username, jobID))
    .... remove all objects in PROCESSORS that have readyflag == True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...