Как запустить поток и мгновенно вернуться к основному коду? - PullRequest
0 голосов
/ 19 января 2020

У меня есть простое представление и сложная функция внутри него:

def addWord(request):

    def calculate():
        <code>

    form = WordCreationForm(request.POST or None)

    if form.is_valid():
        calculate()
        form.save()
        form = WordCreationForm()

    return render(request, 'add_word.html')

Мне нужно calculate(), чтобы работать независимо. Мне не нужны никакие обратные вызовы. Я просто хочу запустить его, а затем сразу же вернуться к сохранению формы. Итак, я сделал это:

import threading
def addWord(request):

    def calculate(num):
        <code>

    form = WordCreationForm(request.POST or None)

    if form.is_valid():
        threading.Thread(target=calculate, args=(request.POST['num'],)).start()
        form.save()
        form = WordCreationForm()

    return render(request, 'add_word.html')

Но в этом случае форма все равно не будет сохранена и отрендерена до тех пор, пока calculate() не будет завершено.

Итак, как лучше всего запустить calculate() асинхронно?

1 Ответ

0 голосов
/ 19 января 2020

Ваша логика потоков c выглядит мне хорошо, и приведенный ниже пример иллюстрирует то же поведение:

import time
from threading import Thread

def printer(): 
    time.sleep(1) 
    print("printer")                                                                                                                                                                                          

 def main(): 
     Thread(target=printer).start() 
     print("finished") 

main()

Он выводит:

finished
printer

Как вы подтвердили, что calculate не вызывается до и после? Или это успешно (это может быть исключение без вашего ведома)

...