2011-03-19 3 views
2

ScénarioQuelle est la meilleure façon d'implémenter un pool de processus de travail compatibles avec gevent?

J'ai un processus serveur mis en œuvre en Python et gevent, qui se connecte à un service de back-end sur TCP/IP et le service de nombreux clients Web (~ 1000 par processus) à l'évolution rapide du contenu dynamique en fonction de la les modifications apportées par le service backend. Le service fonctionne sur Ubuntu 10.04 et ne fonctionnera pas sous Windows, donc la plateforme cible est corrigée. Nous utilisons actuellement Python 2.6.6.

Problème

Au service des changements que beaucoup de clients peuvent provoquer un retard dans le traitement des changements envoyés par le serveur, donc mon plan est de diviser le serveur en plusieurs processus. Un certain nombre de processus de travail desserviraient les clients Web, tandis que le processus principal serait toujours connecté au service backend. J'utilise déjà un pool séparé de greenlets pour servir les clients Web, mais ils doivent être mis en processus de travail.

Question

Pourriez-vous s'il vous plaît me pointer vers une mise en œuvre du pool de processus de travail pour gevent ou savoir comment puis-je utiliser le module propre multitraitement Python avec gevent la bonne façon?

Restrictions

Je voudrais éviter d'introduire des fils Python dans nos processus, car cela donne place à contention GIL, ce qui réduirait les performances en introduisant des latences. Ce serait donc une solution multiprocessing + gevent propre, si possible.

Répondre

1

Je recommande de jeter un oeil à Celery - système de traitement des tâches distribuées écrit en Python.

L'idée de base avec celery est que vous avez une file d'attente (soit RabbitMQ ou Redis), avec les travailleurs écrits comme processus Python, et par le démon exposé celeryd. Selon la documentation sur le céleri, le celeryd prend également en charge le mode gevent (pour les processus liés aux E/S réseau). Il est donc probable que votre code de travail ne nécessitera pas beaucoup de modifications pour s'exécuter dans cet environnement.

2

Je considérerais IPC socket personnalisé ou en utilisant ZeroMQ.

+0

Merci pour votre réponse. J'ai fini par implémenter le socket IPC personnalisé. – fviktor

+0

On dirait que vous aviez raison à ce sujet. L'utilisation de ZeroMQ est la meilleure solution dans de nombreux cas. – fviktor

Questions connexes