У меня есть функция "как" , которая похожа на социальные сети, такие как или функция "thumbs up"; пользователь нажимает на звездочку/сердце/что угодно, чтобы отметить понравившийся контент. Это делается с помощью ajax и должно быть быстрым. Единственная проблема заключается в том, что по каким-то причинам я должен выполнять некоторые задачи для каждого типа, и я узнал, что они были закодированы прямо в представлении "как" , и это замедляет работу. Я думаю об использовании сигналов, чтобы выполнить эти задачи асинхронно, чтобы представление могло сразу отправить json прямо в javascript, не дожидаясь завершения задач. Я начал создавать сигнал для "like", но потом понял, что сигналы Django не являются асинхронными, и это закончится тем же, что представление должно будет дождаться завершения сигнала, чтобы отправить ответ. Поэтому я мог бы попытаться сделать этот сигнал асинхронным, как это объясняется здесь и там, но я бы также использовал сигнал post_save для модели "как" , но теперь мне интересно, может ли просмотр завершить до того, как сигнал будет выполнен?
Является ли Django post_save сигналом асинхронным?
Ответ 1
То, что вы хотите, это поток. Они очень просты в использовании. Вы просто подклассифицируете threading.Thread
и напишите метод run
:
import threading
class LikeThread(threading.Thread):
def __init__(self, user, liked, **kwargs):
self.user = user
self.liked = liked
super(LikeThread, self).__init__(**kwargs)
def run(self):
# long running code here
Затем, когда вы готовы выполнить эту задачу, вы запускаете ее с помощью:
LikeThread(request.user, something).start()
Остальная часть вашего кода просмотра или что-то еще возобновит и вернет ответ, и поток будет с удовольствием выполнять свою работу до тех пор, пока это не закончится, а затем закончится.
См. полную документацию: http://docs.python.org/library/threading.html
Ответ 2
Также просмотрите celery (или более конкретно django-celery). Это планировщик/обработчик задач async. Таким образом, ваш обработчик сигнала post_save создает задачу, которая подбирается и выполняется через сельдерей. Таким образом, у вас все еще есть быстрое приложение, в то время как тяжелая работа выполняется асинхронно, даже на другой машине или партии машин.
Ответ 3
Hm, прежде всего, сигналы в Django не являются асинхронными. Для вашего конкретного случая я думаю, что post_save
- неправильный путь. Самый простой способ - просто запустить запрос ajax для просмотра, который делает ваше подобное действие, и не дожидайтесь ответа. Вместо этого измените свой view/html сразу после того, как вы произнесли запрос.
Это, конечно, требует, чтобы вы заранее знали, что вашему пользователю разрешено использовать этот элемент и что ваш запрос не будет терпеть неудачу.
Ответ 4
Пакет async-signals
(https://github.com/nyergler/async-signals) решает эту проблему. Вы вызываете функцию асинхронного сигнала; если Сельдерей присутствует, пакет использует его для асинхронного вывода сигнала от работника; и если сельдерей не доступен, пакет отправляет сигнал традиционным синхронным способом.