Wielowątkowość dla Pythona Django

Niektóre funkcje powinny działać asynchronicznie na serwerze WWW. Wysyłanie wiadomości e-mail jest klasycznym przykładem.

Jaki jest najlepszy (lub najbardziej pythoniczny) sposób zapisu funkcji dekoratora do uruchomienia funkcji asynchronicznie?

Moja konfiguracja jest wspólna: Python 2.4.7, Django 1.4, Gunicorn 0.17.2

Na przykład, oto początek:

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

Pożądane użycie:

@postpone
def foo():
    pass #do stuff
Author: Marcin, 2013-08-24

3 answers

Zamieściłem powyższe pytanie 18 miesięcy temu. Od tego czasu nadal używam tej implementacji na skalę i w produkcji bez żadnych problemów.

Definicja dekoratora:

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

Przykładowe użycie:

@postpone
def foo():
  #do stuff

Z biegiem czasu, stos został zaktualizowany i transited bez porażki.

Pierwotnie Python 2.4.7, Django 1.4, Gunicorn 0.17.2, teraz Python 2.4.7, Django 1.9, Waitress 0.8.9.

Jeśli używasz jakichkolwiek transakcji bazodanowych, Django utworzy nowe połączenie a to musi być ręcznie zamknięte:

from django.db import connection

@postpone
def foo():
  #do stuff
  connection.close()
 45
Author: tomcounsell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 09:51:03

Selery jest asynchroniczną kolejką zadań/kolejką zadań. Jest dobrze udokumentowany i idealny do tego, czego potrzebujesz. Proponuję zacząć Tutaj

 12
Author: Glyn Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-24 16:36:47

Najczęstszym sposobem przetwarzania asynchronicznego w Django jest użycie selera i django-celery.

 2
Author: Thomas Orozco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-24 16:36:43