CoderCastrov logo
CoderCastrov
Джанго

Фоновые задачи в Django и Heroku

Фоновые задачи в Django и Heroku
просмотров
2 мин чтение
#Джанго

Когда ваша задача/функция требует больше времени для выполнения, лучше сделать ее фоновой задачей и запустить ее. Например, при парсинге/парсере большого количества веб-сайтов может потребоваться более 20-30 секунд для полного выполнения. В этом есть два основных недостатка.

Во-первых, пользователю нужно ждать выполнения задачи в течение 20-30 секунд (это раздражает видеть экран загрузки).

Во-вторых, если ваша функция занимает больше времени для выполнения, то возникает ошибка тайм-аута запроса (например, Heroku имеет максимальное время ожидания запроса 30 секунд, которое нельзя изменить). Таким образом, если время выполнения > 30 секунд, возникает ошибка. Вот почему нужны фоновые задачи. Здесь пользователю не нужно ждать 30 секунд, и он может снова передать другой ввод в ту же функцию, пока предыдущая задача все еще выполняется в фоновом режиме.

Следуйте этим 5 шагам с умом:

views.py

def function(request): if request.method == "POST": form=StudentsForm(request.POST) if form.is_valid(): try: input1 = form.cleaned_data['Size'] input2 = form.cleaned_data['location'] s=form.save() pkey=s.pk scrap(pkey,input1,input2) return redirect('/view')

файл, содержащий функцию "scrap"

from background_task import backgroundfrom app.models import table@background(schedule=0)def scrap(pkey,size,location): num=1000 for i in range(1,num,1): for j in range(1,5,1) : pkey=10 phone=9855900000 addr="Tokyo,Japan" p=table(scrapid=pkey,telephone=phone,address=addr) p.save()

В обычных сценариях, то есть без фоновой задачи, порядок выполнения был бы следующим: 1. Вызов функции парсинга. 2. Выполнение функции. 3. Перенаправление на /view.

Но здесь, так как мы используем фоновую задачу, порядок выполнения изменится. Он будет следующим: 1. Вызов функции парсинга. 2. Создание объекта задачи со всеми параметрами и расписанием (расписание содержит информацию о том, через какое время задача должна быть запущена, расписание = 2 означает, что задача будет запущена через 2 секунды). 3. Перенаправление на /view. 4. Выполнение будет происходить в фоновом режиме (также известно как выполнение фоновой задачи).

  1. Убедитесь, что вы запускаете "python manage.py process_tasks" в новом терминале, чтобы начать выполнение фоновой задачи.

Если вы развернули свой веб-сайт на Heroku, убедитесь, что вы обновили свой Procfile и добавили "worker: python manage.py process_tasks" для выполнения фоновой задачи, как только новая задача добавляется в базу данных.