Как запустить функцию в фоновом режиме в представлении 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
Вернуться на верх