Multithreading pour Python Django

certaines fonctions doivent être exécutées de façon asynchrone sur le serveur web. Envoyer des e-mails est un exemple classique.

Quelle est la meilleure (ou la plus pythonique) façon d'écrire une fonction de décorateur pour exécuter une fonction de façon asynchrone?

ma configuration est commune: Python 2.4.7, Django 1.4, Gunicorn 0.17.2

Par exemple, voici un début:

from threading import Thread

def postpone(function):
    def decorator(*args, **kwargs):
        t = Thread(target = function, args=args, kwargs=kwargs)
        t.daemon = True
        t.start()
    return decorator

utilisation souhaitée:

@postpone
def foo():
    pass #do stuff
28
demandé sur Marcin 2013-08-24 20:32:54

3 réponses

j'ai posté la question ci-dessus il y a 18 mois. Depuis lors, j'ai continué à utiliser cette implémentation à l'échelle et en production sans problèmes.

Décorateur définition:

from threading import Thread
def postpone(function):
  def decorator(*args, **kwargs):
    t = Thread(target = function, args=args, kwargs=kwargs)
    t.daemon = True
    t.start()
  return decorator

Exemple d'utilisation:

@postpone
def foo():
  #do stuff

au fil du temps, la pile a été mise à jour et transitionnée sans faute.

à l'origine Python 2.4.7, Django 1.4, Gunicorn 0.17.2, maintenant Python 2.4.7, Django 1.9, serveuse 0.8.9.

si vous utilisez des transactions de base de données, Django va créer une nouvelle connexion qui doit être fermée manuellement:

from django.db import connection

@postpone
def foo():
  #do stuff
  connection.close()
45
répondu tomcounsell 2017-01-15 09:51:03

Céleri est une file d'attente asynchrone de tâches/de tâches. Il est bien documenté et parfait pour ce dont vous avez besoin. Je vous suggère de commencer ici

12
répondu Glyn Jackson 2013-08-24 16:36:47

la façon La plus courante de faire un traitement asynchrone dans Django est d'utiliser Céleri et django-celery.

2
répondu Thomas Orozco 2013-08-24 16:36:43