Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2013 10:27:55

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

подскажите. Как выполнить функцию при сохранений записи в бд.

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

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

как после сохранения отправить сообщение? Асинхронно. Потомч уто иногда сайт не может отправить сообщение, и основной поток как бы подвисает, пока не вызовется except отправки сообщения.

Офлайн

#2 Май 29, 2013 10:36:05

Vaal
От:
Зарегистрирован: 2010-01-07
Сообщения: 21
Репутация: +  -1  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

использовать очередь? что-то вроде http://python-rq.org/ http://www.celeryproject.org/



Офлайн

#3 Май 29, 2013 10:37:28

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

celery смотрел
но что-то не разобрался.
Мне просто надо выполнить функцию в отдельном потоке. Может питоновсии треад использовать?

Офлайн

#4 Май 29, 2013 12:01:55

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

Ну попробуйте, вот только надо быть внимательным - если функция в новом потоке будет выполняться дольше чем основной поток - как поведет себя Джанга. Т.е. не будет ли “простоя ожидания” на запрос.

import thread
thread.start_new(...)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Май 29, 2013 12:49:54

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

сделал вот так

def send_message():
        try:
            send_mail('NewPostInBlog', 'message',
                      'mail', ['mail'])
        except:
            # временно
            pass
    threading.Thread(target=send_message).start()
соббщения нормально отправляются.
Вроде это мне и надо было.

Офлайн

#6 Май 31, 2013 11:52:44

mks
От:
Зарегистрирован: 2009-08-07
Сообщения: 80
Репутация: +  5  -
Профиль   Отправить e-mail  

асинхронное выполнение функции

В догонку, обычно для таких целей использую вот такой декоратор:

def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target = f, args = args, kwargs = kwargs)
        thr.start()
    return wrapper
Насколько я понимаю, тут главное что бы функция запускаемая в потоке не использовала объекты которые Django уничтожает после отправки ответа.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version