2011-05-03 5 views
7

Nous développons une application distribuée en Python + Celery pour notre file d'attente de tâches.Un mécanisme de type sémaphore pour Celery

Notre application nous oblige à télécharger des emails d'un FAI distant via IMAP (par exemple: gmail) et nous cherchons à pouvoir faire cette tâche en parallèle. Pour un compte e-mail donné, vous avez accès à un nombre limité de connexions de simulation. Nous avons donc besoin d'un moyen de suivre de manière atomique nos connexions actives pour tous les comptes en cours de téléchargement. J'ai trouvé plusieurs exemples de verrous atomiques pour Celery en utilisant Redis, mais aucun qui peut garder une trace d'un pool de ressources limitées comme celui-ci, et toutes les tentatives pour implémenter les nôtres ont rendu difficile le débogage des conditions de course, faisant que nos serrures ne soient jamais libérées par intermittence.

+0

Le céleri n'utilise-t-il pas déjà des piscines? http://docs.celeryproject.org/fr/v2.2.5/internals/reference/celery.concurrency.processes.pool.html?highlight=pool%20limit#celery-concurrency-processes-pool Il semble que ce que vous voulez déjà existe dans le céleri. –

+0

Peut-être que [hot-redis] (https://github.com/stephenmcd/hot-redis) pourrait aider – mmoya

Répondre

2

Comme le céleri utilise la bibliothèque multitraitement pour les processus, vous devriez pouvoir utiliser le processus multiprocessing.Semaphore([value]).

Vous voudrez créer le sémaphore à l'avance et le transmettre, et vous pouvez définir une valeur par défaut égale au nombre maximal d'accès simultanés que vous souhaitez autoriser. Acquérez ensuite votre connexion IMAP et relâchez-la après vous être déconnecté.