Как запустить функцию в фоновом режиме в представлении Django
У меня есть проект Django с одним представлением. Когда я обновляю страницу, я хочу вызвать некоторую функцию, которая очень сложна и требует столько же времени для выполнения. Как и каким образом лучше всего это сделать в бэкграунде?
import time
import psycopg2
from django.http import HttpResponse
def long_time_function(sec):
time.sleep(sec)
print('DONE')
def index(request):
long_time_function(100)
return HttpResponse('INDEX page')
Есть ли какие-то встроенные решения для этого или мне нужно запустить эту функцию с потоком или мультипроцессингом и установить Deamon = True ?
Возможно, вы можете взглянуть на поддержку async. async
С помощью asyncio вы можете запускать несколько async функций в фоновом режиме одновременно и асинхронно в Django view, как показано ниже.
# "store/views.py"
import asyncio
from django.http import HttpResponse
async def test1(num):
print("Test1")
return num + 1
async def test2(num):
print("Test2")
return num + 1
async def test(request):
result1, result2 = await asyncio.gather(test1(2), test2(3))
total = result1 + result2
print(total) # 7
return HttpResponse(total) # Return 7
Ниже приведен результат:
Test1
Test2
7
[03/Nov/2022 15:12:30] "GET /store/test/ HTTP/1.1" 200 1
А с помощью threads вы также можете запускать multiple functions in background concurrently в Django view, как показано ниже.
# "store/views.py"
from threading import Thread
from django.http import HttpResponse
def test1(num, r):
print("Test1")
r[0] = num + 1
def test2(num, r):
print("Test2")
r[0] = num + 1
def call_tests_view(request):
result1 = [None] # Here
result2 = [None] # Here
thread1 = Thread(target=test1, args=(2, result1), daemon=True)
thread2 = Thread(target=test2, args=(3, result2), daemon=True)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
total = result1[0] + result2[0]
print(total) # 7
return HttpResponse(total) # Return 7
Ниже приведен результат:
Test1
Test2
7
[03/Nov/2022 15:16:45] "GET /store/test/ HTTP/1.1" 200 1