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
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()
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
la façon La plus courante de faire un traitement asynchrone dans Django est d'utiliser Céleri et django-celery
.