Я работаю над приложением Django. У меня есть конечная точка API, которая, если требуется, должна выполнять функцию, которая должна повторяться несколько раз (пока не будет выполнено какое-либо условие). Как я имею дело с этим сейчас -
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
Пока я знаю, что это ужасный подход и что я не должен блокироваться в течение 2 секунд, я не могу понять, как обойти его.
Это работает, скажем, в ожидании 4 секунд. Но я хотел бы что-то, что заставляет цикл работать в фоновом режиме, и остановится, как только some_fn вернет True. (Также, конечно, some_fn вернет True)
РЕДАКТИРОВАТЬ -
Чтение ответа Oz123 дало мне представление, которое, похоже, работает. Вот что я сделал -
def shut_down(params):
# Do some stuff
# Offload the blocking job to a new thread
t = threading.Thread(target=some_fn, args=(id, ), kwargs={})
t.setDaemon(True)
t.start()
return True
def some_fn(id):
while True:
# Do the job, get result in res
# If the job is done, return. Or sleep the thread for 2 seconds before trying again.
if res:
return
else:
time.sleep(2)
Это делает работу для меня. Это просто, но я не знаю, насколько эффективна многопоточность в сочетании с Django.
Если кто-то может указать на подводные камни этого, то критикуют.