Django Tâche En Arrière-Plan
J'ai besoin pour remplir une base de données SQLite toutes les quelques minutes dans Django, mais je veux servir des données périmées jusqu'à ce que les données sont disponibles pour la base de données à mise à jour. (c'est à dire je ne veux pas bloquer pour que les données soient recueillies; la seulement temps, je peux bloquer est si il y a un verrou sur la base de données, au cours de laquelle je n'ai pas le choix.)
Je ne veux pas installer un autre programme ou d'une bibliothèque.
Comment pourrais-je aller sur la configuration d'un autre thread qui pourrait appeler save()
sur un tas de modèles, sans se heurter à des problèmes de threading?
- "Je ne veux pas installer un autre programme ou une bibliothèque" Souvent coûteuse politique. Le céleri fait pour vous. Pourquoi ne pas simplement installer le céleri?
- Parce que ça va être sur un serveur et je veux éviter le dumping des choses sur le serveur autant que je le peux. N'est-il pas un peu exagéré pour juste un thread séparé?
- "N'est-il pas un peu exagéré pour juste un thread séparé?" No. de "dumping des choses sur le serveur"? Une installation d'un dumping? Je ne comprends pas l'objection. Voulez-vous que ça fonctionne, ou voulez-vous écrire, de tester et de déboguer beaucoup de code?
- Je veux que ça fonctionne, mais je ne vois pas pourquoi j'ai besoin d'un ensemble de bibliothèque juste pour faire un seul thread. Si vous pouvez me convaincre, je suis tout à fait pour, mais il semble vraiment inutile pour moi en ce moment, surtout depuis que c'est en Python (ce qui semble inclure un module pour, comme, tout).
- Malheureusement. Ce n'est pas un "simple fil". Vous gardez en disant ça, mais c'est faux. Il n'y a pas de "convaincre" si vous continuer à prétendre que c'est un "simple fil". Si c'était simple, vous l'avez déjà faite.
If it was actually simple, you would have done it already.
Bien, en fait, je suis de nouveau à Python et Django, donc je ne peux pas imaginer qu'il soit si difficile; j'ai juste pensé que je ne sais pas comment le faire. Je ne suis pas encore sûr de la partie qui requiert la bibliothèque, cependant: est-il le verrou de base de données? Est-il le thread lui-même? Ou est-ce autre chose qui complique la question, qui, je l'oublie?- Vous ne pouvez pas générer un nouveau thread. Django s'exécute dans un environnement de serveur web et cela signifie que, normalement, le code n'est exécuté chaque fois que le serveur reçoit une demande, et cela signifie que le code doit s'exécuter rapidement et à l'arrivée aussi vite que possible pour éviter d'accaparer les serveurs de threads. Aussi, comme le code n'est exécuté à chaque fois qu'une demande est reçue, il est difficile de garantir que quelque chose se passe "toutes les quelques minutes". Si j'étais vous, je voudrais écrire un distinct script python pour cela, et de l'exécuter via cron. Cron est installé partout 🙂
- En fait, je suis de nouveau à Python et Django". Une raison de plus pour installer et utiliser la solution standard que presque tout le monde utilise: le céleri. Pensez à supprimer votre "aussi ne voulez pas l'installer" à partir de la question, car c'est une très, très mauvaise idée, surtout pour un n00b.
- Merci beaucoup pour l'info, si je ne suis pas sûr que je vais aller dans cette voie. 🙂 @S. Lott: Votre commentaire est comme dire à un "n00b" pour installer Eclipse ou Visual Studio afin qu'il puisse faire son premier Bonjour, programme Mondial. Il pourrait être utile d'avoir un IDE, mais (1) il est exagéré, (2) la personne pense qu'il aura toujours besoin d'un IDE, (3) il ne saura jamais la raison derrière le conseil. Donc, si au lieu de m'appeler un n00b, vous l'dit moi pourquoi je ne devrais pas le faire (peut-être que AHM fait?), alors je risque de vraiment comprendre ce que tu veux dire.
- overkill" False". la personne pense qu'il aura toujours besoin d'un IDE". Quoi?", il ne saura jamais la raison derrière les conseils" je continue à essayer d'expliquer et de vous garder de rejet de l'explication. Ce n'est pas simple. De combien de façons différentes, dois-je le dire?
- Oui, en utilisant un IDE pour écrire de petits programmes est overkill. Très overkill. Si vous pensez que l'utilisation d'Eclipse et Visual Studio/etc. est une bonne introduction à la programmation, alors en effet, je vais probablement jamais comprendre ce que tu veux dire à propos de ce soit, de sorte qu'il ne sera probablement pas la peine d'argumenter sur elle. :\
- L'IDE analogie n'a pas de sens. Même avec l'explication. Ce n'est pas comparable en quelque sorte à l'aide de Céleri. Veuillez cesser de le répéter.
- Bien dans ce cas, pas besoin pour moi d'argumenter; merci pour l'entrée.
- À l'aide d'un add-on comme le céleri est comme l'utilisation d'un SGBDR ou à l'aide d'Apache. C'est l'essentiel. Il n'est rien comme l'utilisation d'un IDE.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la recherche d'une solution légère pour l'exécution des trucs en arrière-plan plutôt que d'une véritable gestion des tâches du système, jetez un oeil à django-utils. Il comprend, entre autres choses, un @async fonction de décorateur qui va faire une fonction exécuter de manière asynchrone dans un thread séparé.
L'utiliser comme ceci:
Ensuite, vous pouvez appeler le
load_data_async function
pour le fond, ou la normaleload_data
fonction de blocage de l'exécution.Juste assurez-vous d'installer une version avant 2.0, car qui n'a pas la @async décorateur.
Remarque: même Si l'installation de django-utils, ce serait trop, vous pouvez simplement télécharger et inclure les quelques fichiers requis dans votre projet.
readthedocs
lien était erroné : django-utils documentation n'existe pas ici.from djutils.decorators import async
avec Django 1.10 soit. Il veut importer hashcompat qui a été abandonné dans Django 1.6. Je voudrais déposer un rapport de bug, mais le projet semble être mort 🙁Céleri.
Dépend si vous avez besoin de la mise à jour à regarder atomique du point de vue des lecteurs. Si vous n'avez pas l'esprit en voyant les données anciennes et nouvelles ensemble, il suffit de créer un gestion personnalisée de commande qui remplit les données, et d'exécuter toutes les quelques minutes de cron.
Si vous en avez besoin pour regarder atomique, de conditionnement, l'ensemble de l'écrit dans un SQLite transaction via django.db.transaction devrait probablement vous fournir les verrous.
cron
avant, mais-à moins que je ne suis malentendu c' -- ce n'est pas complètement distinct du programme? Est-ce à dire que je dois créer un, appelcron
à partir de mon serveur, et lancez le programme de mise à jour de la base de données?cron
, les Fenêtres ont en.wikipedia.org/wiki/Task_SchedulerJuste une mise à jour rapide sur John Lehmann réponse: django-fond-tâche était plus maintenu et est incompatible avec les nouvelles version de Django. Nous avons mis à jour et étendu avec de nouvelles fonctionnalités, il y a un moment et le maintien de la nouvelle compatible paquet sur Github. La nouvelle django-fond-tâches application peut être téléchargé ou installé à partir du PyPI.
Django Tâche En Arrière-Plan est une base de données adossés à des travaux de la file d'attente pour Django, vaguement basé autour de Ruby DelayedJob bibliothèque.
Vous décorer des fonctions pour créer des tâches:
Si vous avez encore besoin de quelque chose qui les horaires de ces tâches. Certains des avantages incluent des tentatives automatiques pour les tâches qui ont échoué, et 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 restriction.
J'ai eu le même problème mais n'a pas voulu exécuter un service comme le céleri pour résoudre le problème.
J'ai trouvé posix_spawn sur les systèmes linux. Vous pouvez écrire manage.py les commandes qui s'exécutent dans votre plein django environnement. Ces commandes peuvent être exécutées en arrière-plan avec ce projet.
Si vous avez besoin de transmettre des données sur le site web pendant la course, j'ai utiliser memcached.
https://github.com/lukedupin/django_posix_spawn