Найти - Пользователи
Полная версия: асинхронное выполнение функции
Начало » Django » асинхронное выполнение функции
1
ilnur
подскажите. Как выполнить функцию при сохранений записи в бд.

Допустим есть мето save.

class SomeClass(models.Model):
   ...
   def save(...):
        # что-то делаю
        # после сохранения необходимо отправить сообщение

как после сохранения отправить сообщение? Асинхронно. Потомч уто иногда сайт не может отправить сообщение, и основной поток как бы подвисает, пока не вызовется except отправки сообщения.
Vaal
использовать очередь? что-то вроде http://python-rq.org/ http://www.celeryproject.org/
ilnur
celery смотрел
но что-то не разобрался.
Мне просто надо выполнить функцию в отдельном потоке. Может питоновсии треад использовать?
JOHN_16
Ну попробуйте, вот только надо быть внимательным - если функция в новом потоке будет выполняться дольше чем основной поток - как поведет себя Джанга. Т.е. не будет ли “простоя ожидания” на запрос.
import thread
thread.start_new(...)
ilnur
сделал вот так
def send_message():
        try:
            send_mail('NewPostInBlog', 'message',
                      'mail', ['mail'])
        except:
            # временно
            pass
    threading.Thread(target=send_message).start()
соббщения нормально отправляются.
Вроде это мне и надо было.
mks
В догонку, обычно для таких целей использую вот такой декоратор:
def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target = f, args = args, kwargs = kwargs)
        thr.start()
    return wrapper
Насколько я понимаю, тут главное что бы функция запускаемая в потоке не использовала объекты которые Django уничтожает после отправки ответа.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB