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?

17
demandé sur Mehrdad 2011-07-07 00:47:53

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.

18
répondu Jaka Jaksic 2017-10-10 09:38:42

Céleri.

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.

16
répondu S.Lott 2011-07-07 10:43:18

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.

5
répondu che 2015-07-06 07:59:32

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.

5
répondu phi 2015-12-09 13:39:37

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.

4
répondu John Lehmann 2014-12-17 19:22:34

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.

https://github.com/lukedupin/django_posix_spawn

1
répondu Luke Dupin 2015-09-11 21:18:43