Le céleri horaire de la tâche (Céleri, Django et RabbitMQ)
Je veux avoir une tâche qui sera exécutée à chaque 5 minutes, mais il faudra attendre la dernière exécution à la fin et puis commencer à compter les 5 minutes. (De cette façon, je peux aussi être sûr qu'il n'y a qu'une seule tâche en cours d'exécution) de La façon la plus simple que j'ai trouvé est d'exécuter application django manage.py shell et exécuter ceci:
while True:
result = task.delay()
result.wait()
sleep(5)
mais pour chaque tâche que je veux pour l'exécution de cette manière que j'ai pour exécuter son propre shell, est-il un moyen facile de le faire? Peut-être certains le roi personnalisée ot django céleri planificateur?
OriginalL'auteur Julian Popov | 2011-03-19
Vous devez vous connecter pour publier un commentaire.
Tous vous avez besoin est de spécifier dans le céleri conf sorcière de la tâche que vous souhaitez exécuter périodiquement et avec quel intervalle.
Exemple: Exécuter les tâches.ajouter la tâche toutes les 30 secondes
N'oubliez pas que vous devez exécuter le céleri dans le rythme de mode avec l'option-B
Vous pouvez également utiliser la crontab de style au lieu de l'intervalle de temps, la caisse:
http://ask.github.com/celery/userguide/periodic-tasks.html
Si vous utilisez django-céleri n'oubliez pas que vous pouvez également utiliser tha django db en tant que planificateur de tâches périodiques, de cette façon, vous pouvez facilement ajouter d'auge django-céleri panneau d'admin de nouvelles tâches périodiques.
Pour ce faire, vous devez définir la celerybeat planificateur de tâches settings.py de cette façon
Merci pour les conseils, mais je pense que je veux quelque chose d'autre, je veux créer un emploi, et de l'envoyer pour l'exécution, et de créer un autre emploi que lorsque l'EXÉCUTION de la précédente est terminée. Je ne veux pas créer des emplois jusqu'à ce que je sais que la précédente est terminée. Je veux la tâche d'avoir synchrone (pas asynchrone) le comportement
L'objectif global est d'exécuter une tâche pour laquelle je ne peux pas dire combien de temps cela va prendre et quand c'est fini attendre pendant un certain temps et de commencer à nouveau. Aussi je dois être sûr qu'il ne sera pas exécuté 2 fois ou plus simultanément par différents threads de travail, et aussi que je n'ai pas à écrire mon propre code de programme pour le faire.
Si vous souhaitez vous assurer qu'une tâche ne commence qu'après le dernier terminé, utiliser memcached (ou django cache) pour créer un verrou sur le type de tâche ou une ressource dans cette tâche. Il est facile et évolutive à faire.
Ce n'est pas vrai, à moins que de 3.0.12,
celery beat
sera très certainement créer le chevauchement des tâches.OriginalL'auteur Mauro Rocco
Wow c'est incroyable de voir comment personne ne comprend cette personne en question. Ils demandent pas sur l'exécution de tâches périodiquement, mais comment s'assurer que le Céleri ne pas exécuter deux instances d'une même tâche simultanément. Je ne pense pas qu'il y a un moyen de le faire avec le Céleri directement, mais ce que vous pouvez faire est d'avoir une des tâches acquérir un verrou à droite quand il commence, et si cela échoue, essayez à nouveau dans quelques secondes (à l'aide de réessayer). La tâche de libérer le verrou juste avant il retourne, vous pouvez faire le lock auto-expire après quelques minutes, si jamais il se bloque ou heures.
Pour le bloquer, vous pouvez probablement utiliser votre base de données ou quelque chose comme Redis.
OriginalL'auteur Cesar
Vous pouvez être intéressé par cette méthode plus simple qui ne nécessite aucune modification du céleri conf.
La dernière version de céleri ne disposez pas de ce décorateur. Vous avez juste à suivre les instructions ici: docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
OriginalL'auteur Conley Owens
Étendre sur @MauroRocco de la poste, à partir de http://docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.html
Donc ce sera en effet atteindre l'objectif que vous voulez.
Si vous souhaitez que la tâche d'exécuter toutes les 30 secondes, indépendamment de la durée que vous avez à utiliser un crontab sur le calendrier, mais rappelez-vous que cette tâche sont ajoutés au céleri et de file d'attente si il y a d'autres tâches dans l'exécution de/dans la file d'attente que vous n'êtes pas sûr que vous la tâche commencer au moment donné.
OriginalL'auteur dkuebric
En raison de céleri.les décorateurs obsolète, vous pouvez utiliser periodic_task décorateur comme ça:
OriginalL'auteur Murat Çorlu
Ajouter cette tâche à une file d'attente, et ensuite utiliser un autre travailleur pour que la file d'attente avec la simultanéité de l'option 1.
OriginalL'auteur josven