programmation - python threading example




Multithreading pour Python Django (2)

Certaines fonctions doivent s'exécuter de manière asynchrone sur le serveur Web. Envoyer des emails est un exemple classique.

Quelle est la meilleure façon (ou la plus pythonique) d'écrire une fonction de décorateur pour exécuter une fonction de manière 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

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

Définition du décorateur:

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 transférée sans échec.

Originellement Python 2.4.7, Django 1.4, Gunicorn 0.17.2, maintenant Python 2.4.7, Django 1.9, Waitress 0.8.9.

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

from django.db import connection

@postpone
def foo():
  #do stuff
  connection.close()

La méthode la plus courante de traitement asynchrone dans Django consiste à utiliser le Celery et le django-celery .





decorator