2017-03-06 1 views
2

J'essaye d'implémenter un ThreadPool + Scheduler dans Python 2.7 avec le module Threading. Mon pool contient des threads qui sont alloués à l'avant, et mon planificateur gère le thread qui doit effectuer la tâche. J'ai des threads qui exécutent un processus système et attendent le résultat. Ces appels système peuvent prendre beaucoup de temps et j'espérais pouvoir réutiliser le thread pendant l'exécution de la tâche.Programmation de threads Python

Exemple:

  1. ThreadPool a 8 fils
  2. 8 tâches sont disponibles dans tous ensemble
  3. tâche 9 vient après un petit retard
  4. Tâche 1 prend 1024 ans (Peut-être qu'il pourrait utiliser certains optimisation).
  5. Tâches 2-8 prendre 1 an.
  6. La tâche 9 arrive, et cela ne prend que 1 seconde.
  7. La tâche 9 ne peut pas être exécutée car tous les threads sont utilisés.

Tâche 1 a un code similaire à ce

build_process = subprocess.Popen(build_command, shell=False) 
build_process.wait() 

est-il de toute façon de saisir le fil de Task1 alors qu'il attend, et faire Tâche 9? Puis, lorsque la tâche 9 se termine, revenez à la tâche 1 (en attendant que le processus se termine?) Python a-t-il déjà implémenté quelque chose comme cela?

Répondre

1

Non, ce n'est pas possible dans Python de base. Ce qui serait possible, bien que beaucoup plus de travail que d'avoir juste un dixième thread, serait d'avoir une queue de choses à faire, avoir le thread principal dans cette file d'attente (jusqu'à présent c'est normal), et Ensuite, chaque thread doit être suffisamment intelligent pour savoir quand il est en attente (pour qu'un sous-processus soit terminé, par exemple) et ensuite prendre une autre tâche. Notez que je ne recommande pas cette approche. Créez simplement un autre thread dans votre pool de threads. Si vous avez un moyen de savoir quelles tâches sont rapides et lesquelles sont courtes, vous pouvez créer deux pools d'unités d'exécution: un pour les tâches longues et un pour les tâches rapides et affecter la tâche à la file d'attente du pool approprié.

+0

Merci. Ce n'est pas un événement possible dans les nouvelles versions de Python? – Taztingo

+0

@Taztingo: Malheureusement non. Une fois qu'un thread est démarré, la seule façon de manipuler ce thread est de l'intérieur du thread lui-même, auquel cas vous pouvez aussi avoir un dixième thread. –