Django Tâche En Arrière-Plan
je dois alimenter une base de données SQLite toutes les quelques minutes à Django, mais je veux servir des données périmées jusqu'à ce que les données soient disponibles pour la base de données à être mis à jour. (c'est à dire je ne veux pas bloquer pour que les données soient recueillies; la le temps que je peux bloquer est s'il y a un verrou sur la base de données, pendant lequel je n'ai pas le choix.)
Je ne veux pas non plus installer un programme séparé ou une bibliothèque.
Comment pourrais-je configurer un autre fil qui pourrait appeler save()
sur un tas de modèles, sans se heurter à des problèmes de threading?
6 réponses
si vous cherchez une solution légère pour exécuter des choses en arrière-plan plutôt qu'un système complet de gestion des tâches, jetez un coup d'oeil à django-utils. Il comprend, entre autres choses, un @async décorateur de fonction qui fera exécuter une fonction de façon asynchrone dans un thread séparé.
l'Utiliser comme ceci:
from djutils.decorators import async
@async
def load_data_async():
# this will be executed in a separate thread
load_data()
Ensuite, vous pouvez appeler le load_data_async function
pour le fond, ou la normale load_data
la fonction de blocage exécution.
assurez-vous simplement d'installer une version avant 2.0, car il n'y a pas de décorateur @async.
Note: si même installer django-utils serait trop, vous pouvez tout simplement télécharger et inclure les quelques fichiers requis dans votre projet.
Celery est une file d'attente asynchrone basée sur la transmission de messages distribués. Il est axé sur le fonctionnement en temps réel, mais prend également en charge l'ordonnancement.
Celery est écrit en Python, mais le protocole peut être implémenté dans n'importe quelle langue. Il peut également fonctionner avec d'autres langues en utilisant des webhooks.
Dépend si vous avez besoin de la mise à jour à regarder atomique du point de vue des lecteurs. Si cela ne vous dérange pas de voir les anciennes et les nouvelles données ensemble, créez juste un gestion personnalisée de la commande qui remplit les données, et d'exécuter toutes les quelques minutes de cron.
si vous en avez besoin pour avoir l'air atomique, envelopper toutes les Écritures en une seule SQLite transaction par django.DB.transaction devrait probablement vous fournir le nécessaire verrouillage.
juste une mise à jour rapide sur la réponse de John Lehmann: django-background-tâche était non maintenue et incompatible avec la nouvelle version de Django. Nous l'avons mis à jour et étendu avec de nouvelles fonctionnalités il y a un certain temps et en maintenant le nouveau paquet compatible backward sur Github. La nouvelle django-fond-tâches app peut être téléchargé ou installé à partir du PyPI.
Django Tâche En Arrière-Plan est une file d'attente de travail basée sur une base de données pour Django, vaguement basée autour de la bibliothèque DelayedJob de Ruby.
vous décorez des fonctions pour créer des tâches:
@background(schedule=60)
def notify_user(user_id):
# lookup user by id and send them a message
user = User.objects.get(pk=user_id)
user.email_user('Here is a notification', 'You have been notified')
bien que vous ayez encore besoin de quelque chose qui planifie ces tâches. Certains avantages incluent des réessais automatiques pour les tâches ratées, et le réglage de la durée maximale pour une tâche en cours d'exécution.
Cela n'implique une autre dépendance, mais pourrait être utile à certains lecteurs, sans que restriction.
j'avais le MÊME PROBLÈME MAIS je ne voulais pas lancer un service comme celery pour résoudre le problème.
j'ai trouvé posix_spawn sur des systèmes linux. Vous pouvez écrire manage.py commandes qui fonctionnent dans votre environnement django complet. Ces commandes peuvent être exécutées en arrière-plan avec ce projet.
si vous avez besoin de transmettre des données au site Web pendant le lancement, j'utilise memcached.