À l'aide de Céleri sur les processus et les gevent dans les tâches en même temps
Je voudrais utiliser le Céleri comme une file d'attente pour mes tâches donc mon application web pourrait mettre en file d'attente d'une tâche, de renvoyer une réponse et la tâche sera traitée pendant ce temps /un jour /... - je construire une sorte d'API, donc je ne sais pas quel genre de tâches sera là à l'avance - à l'avenir, il peut y avoir des missions concernant les requêtes HTTP, un autre IO, mais aussi de l'UC-tâches longues. Sur ce, je voudrais Céleri travailleurs sur les processus, comme ceux-ci sont universels sorte de parallélisme en Python.
Cependant, je voudrais utiliser gevent dans mes tâches trop, afin que je puisse avoir un seul et unique groupe de frai de nombreuses requêtes HTTP, etc. Le problème c'est que quand je fais ceci:
from gevent import monkey
monkey.patch_all()
Céleri arrêts de travail. Il commence, mais aucune tâche ne peut être efficacement mis en file d'attente - ils semblent aller pour le courtier, mais Céleri travailleur n'a pas les collecter et les traiter. Commence seulement et attend. Si je supprime ces lignes et effectuer la tâche sans gevent et la parallélisation, tout fonctionne.
Je pense que ça pourrait être parce que gevent patchs aussi threading. J'ai donc essayé
from gevent import monkey
monkey.patch_all(thread=False)
...mais ensuite le Céleri n'est pas même de commencer, il se bloque sans raison (niveau de débogage de l'enregistrement activé).
Est-il possible d'utiliser le Céleri pour le replacement des tâches et gevent pour faire des trucs à l'intérieur d'une seule et même tâche? Comment? Que dois-je faire de mal?
- +1 j'ai pensé à la même chose aussi, ces derniers temps.
- Il peut y avoir quelques problèmes avec gevent.le singe.patch_all() github.com/kennethreitz/grequests/issues/8
- Sûrement. Malheureusement, il est nécessaire d'exécuter une telle déclaration dans le but d'utiliser gevent avec des sockets etc.
- Êtes-vous commencer le eventloop après le démarrage du fils verts? par exemple:
gevent.joinall()
Le plus gros problème c'est le nettoyage par la suite je pense. Autant que je sache, vous ne pouvez pas temporairement patch, le processus devrait être à jour pour toujours. - Oui, j'ai d'abord créé greenlets et ensuite utilisé
gevent.joinall()
.
Vous devez vous connecter pour publier un commentaire.
Je crois que la méthode recommandée pour démarrer la tâche est comme suit.
Gevent doit être corrigée dès que possible.
Vous pouvez exécuter le céleri avec plusieurs threads contenant plusieurs greenlets comme ceci:
À partir de mon expérience étrange, le Céleri Battre ne peut pas fonctionner correctement avec les travailleurs avec gevent piscine (tâches planifiées sont bloqués et attendre une éternité), sauf si vous activez gevent monkey patching pour Battre processus.
Cependant,
celery beat
ne prend pas en charge--pool=gevent
ou-P gevent
option. La bonne façon d'injecter gevent monkey patching est d'utiliser un curstomizedcelery
binaires, tels que:De l'enregistrer comme
celery-gevent
, et exécuter Battre le service comme suit:Dans
proj.celery
vous devez également patch Django connexion pour éviterDatabaseError
:(L'exemple ci-dessus fonctionne pour Python 2.7.10, Céleri 3.1.18, Django 1.8.2 et gevent 1.0.2)
-P
option, car elle n'en a pas besoin: il n'y a pas de tâches de la piscine. C'est un processus léger qui ajoute périodiquement des tâches à la piscine. Je l'utilise très bien avec gevent travailleurs w/o tous les hacks comme ça, mais ensuite, je n'utilise pas--app
ouDjangoLoader
, juste un céleri fichier de configuration des listes de tâches et de leurs horaires.Autant que j'ai pu apprendre, ce n'est pas possible. Si quelqu'un trouve une meilleure réponse, je vais l'accepter au lieu de cette mine.
La seule option est d'utiliser gevent aussi comme un backend pour le Céleri travailleurs. Ce qu'il faut faire afin d'accomplir une telle chose est d'ajouter des éléments suivants dans le fichier de config:
Plus de détails à ce sujet peuvent être trouvées ici. Plus d'informations sur le gevent piscine est sur cette page. L'esprit le fait que la gevent piscine est toujours marquée comme expérimentale. J'ai trouvé aucun point de référence pour comparer les processus et les async gevent piscine sur les différentes tâches (IO-axées sur les tâches, CPU des tâches orientées), mais finalement j'ai réalisé que même mon CPU tâches seront en fait plus d'IO que de CPU, parce que j'utilise la base de données pour enregistrer les résultats et la connexion de base de données va être un goulot d'étranglement, pas le calcul de la partie. J'aurai pas de tâches scientifiques qui serait vraiment touché le CPU.
-P
n'était pas là. J'ai accepté myusuf3 de réponse.