2011-07-17 3 views
0

J'ai essayé toutes sortes de solutions au problème suivant; en vain.Création de threads pilotée par événement

J'ai un grand nombre de modules/scripts (python) et un script distingué, K.py. Lorsque K.py est exécuté, il génère des informations, par exemple un nom de pays. Maintenant, parmi les autres modules (des centaines) il y aura des modules qui peuvent être exécutés avec l'information (le nom du pays, pour cet exemple) généré par K.py qui leur est passé en entrée. Récursivement, chacun des modules ci-dessus va générer des informations (noms de villes, numéros de rue, etc.), qui peuvent servir d'entrée pour d'autres modules, etc. Cela va bien sûr aboutir à l'exécution d'un arbre binaire de scripts.

Points à noter.

  • les modules/scripts (des centaines) ci-dessus peuvent fonctionner indépendamment (ils ne sont pas entre dépendent de quelque manière que ce soit)
  • je devrais être en mesure de mettre un verdict lorsque tous les modules ont terminé l'exécution (c'est l'exécution de K.py doit se bloquer jusqu'à ce que l'arbre binaire déclenché des modules d'exécution soit "joint"). Si, pour chaque information I, et le script exécutable S (c'est-à-dire, S peut fonctionner avec I comme entrée), je décide de créer un nouveau thread, je pourrais finir avec un nombre exponentiel de threads (Non ?)

Comment puis-je utiliser des threads python (l'une des API) pour implémenter «en toute sécurité» une solution? (pseudo_code?)

Merci d'avance pour votre sagesse.

Répondre

2

La manière habituelle de résoudre ce problème consiste à créer une file d'attente de travail et à y stocker les tâches individuelles. Vous avez donc besoin d'une sorte de représentation programmatique du travail qui devrait être effectué par un thread.

Si vous en avez, vous pouvez utiliser le multiprocessing package qui offre un pool de "threads" (voir 16.3.1.5.) Et une file d'attente multithread pour stocker les jobs.

Maintenant, chaque processus prend un travail de la file d'attente, l'exécute (peut-être ajoute de nouveaux travaux à la file d'attente) et quand il termine prend le suivant. Vous avez terminé lorsque la file d'attente est vide. Notez que cela utilise le package multi-traitement, car au moins dans CPython avec le GIL, un programme python multithread n'est avantageux qu'en cas de grosse E/S ou d'autres activités de blocage.

+0

Merci Voo. J'essaie le package multi-traitement. (Je pense à d'autres façons de représenter le «travail», comme dit le Pool (..) doit décaper, etc.). Merci beaucoup. – dop

+0

Je ne suis pas sûr de ce que vous voulez dire avec le Pool put() (ne voyez pas une telle méthode?) Et le décapage. Personnellement, je créerais simplement une boucle while qui supprime le premier élément de la file d'attente et le traite. Si la file d'attente est vide, tous les threads reviennent et nous avons terminé. Vous démarrez le processus en créant la file d'attente, en y insérant le ou les premiers travaux, puis en utilisant le pool. – Voo

Questions connexes