À 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().