Подтвердить что ты не робот

Является ли Django post_save сигналом асинхронным?

У меня есть функция "как" , которая похожа на социальные сети, такие как или функция "thumbs up"; пользователь нажимает на звездочку/сердце/что угодно, чтобы отметить понравившийся контент. Это делается с помощью ajax и должно быть быстрым. Единственная проблема заключается в том, что по каким-то причинам я должен выполнять некоторые задачи для каждого типа, и я узнал, что они были закодированы прямо в представлении "как" , и это замедляет работу. Я думаю об использовании сигналов, чтобы выполнить эти задачи асинхронно, чтобы представление могло сразу отправить json прямо в javascript, не дожидаясь завершения задач. Я начал создавать сигнал для "like", но потом понял, что сигналы Django не являются асинхронными, и это закончится тем же, что представление должно будет дождаться завершения сигнала, чтобы отправить ответ. Поэтому я мог бы попытаться сделать этот сигнал асинхронным, как это объясняется здесь и там, но я бы также использовал сигнал post_save для модели "как" , но теперь мне интересно, может ли просмотр завершить до того, как сигнал будет выполнен?

4b9b3361

Ответ 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) решает эту проблему. Вы вызываете функцию асинхронного сигнала; если Сельдерей присутствует, пакет использует его для асинхронного вывода сигнала от работника; и если сельдерей не доступен, пакет отправляет сигнал традиционным синхронным способом.