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
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()
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
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
.
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