Utilisez une instance Queue.Queue
, intrinsèquement thread-safe. Chaque thread peut .put
ses résultats à cette instance globale quand il est fait, et le thread principal (quand il sait que tous les threads de travail sont faits, par .join
par exemple comme dans la réponse de @ unholysampler) peut en boucle chaque résultat, et utiliser chaque résultat à .extend
la liste "résultat global", jusqu'à ce que la file d'attente soit vidée.
Modifier: il y a d'autres gros problèmes avec votre code - si le nombre maximum de threads est inférieur au nombre de mots-clés, il ne s'arrêtera jamais (vous essayez de démarrer un thread par mot-clé - jamais moins - mais si vous avez déjà commencé les nombres max vous bouclez pour toujours à aucune autre fin).
Tenir compte au lieu d'utiliser une piscine filetage, un peu comme celui de this recipe, sauf que, au lieu de faire la queue appelables vous file d'attente les mots-clés - depuis le appelable que vous voulez exécuter dans le fil est le même dans chaque fil, juste en variant l'argument. Bien sûr, cet appel sera modifié pour retirer quelque chose de la file d'attente des tâches entrantes (avec .get
) et .put
la liste des résultats dans la file d'attente des résultats sortants une fois terminé.
Pour terminer les fils N, vous pouvez, après tous les mots clés, .put
N « factionnaires » (par exemple None
, en supposant que mot-clé peut être None
): appelable sortie volonté d'un fil si le « mot-clé » juste tiré est None
.
Plus souvent qu'autrement, Queue.Queue
offre la meilleure façon d'organiser les architectures de threading (et multiprocessing!) En Python, qu'elles soient génériques comme dans la recette que je vous ai indiquée, ou plus spécialisées comme je le suggère pour votre cas d'utilisation dans les deux derniers paragraphes.
Merci, votre réponse est la plus facile pour moi de comprendre, va l'essayer dès maintenant. – jahmax