2017-09-11 2 views
1

Pour un ThreadPoolExecutor, je veux surveiller le nombre de threads qui sont en cours d'exécution. Mais il semble que c'est impossible. Le nombre de threads actifs augmente continuellement. Pour un thread normal, si la fonction cible revient, le thread s'arrêtera.Réduire le nombre de threads actifs créés par ThreadPoolExecutor?

import threading, concurrent.futures 

def test(): 
    pass 

p_ac=threading.active_count() 
#Number of threads=2 

#for threads 
trs=[None]*10 
for i in range(10): 
    trs[i]=threading.Thread(target=test) 
    trs[i].start 

print(threading.active_count()==p_ac) 
#True 

#for executor 
executor=concurrent.futures.ThreadPoolExecutor(10) 
for _ in range(10): 
    executor.submit(test) 
print(threading.active_count()) 
#Number of threads=12 

Répondre

2

Le ThreadPoolExecutorne fait pas arrêt ses fils lorsqu'ils sont actifs. ThreadPoolExecutor(X) crée X fils et les maintient en vie jusqu'à ce que vous arrêtez l'exécuteur via executor.shutdown() ou l'exécuteur testamentaire décide lui-même, il n'a pas besoin d'autant de fils. Quoi qu'il en soit X est le nombre attendu de threads si l'exécuteur est actif.

+0

Alors, est-ce que je peux suivre le nombre de threads qui fonctionnent réellement? Mon but est de choisir un nombre optimisé de max_workers. Actuellement, j'utilise un compteur global pour faire cela (c'est-à-dire +1 lors de la soumission de la fonction et -1 lorsque la fonction retourne). – user2923419

+0

@ user2923419 Vous n'avez pas besoin de suivre le nombre de threads lorsque vous utilisez ThreadPoolExecutor. Vous pouvez supposer qu'il existe autant de threads que vous avez définis. Je ne suis pas sûr de ce que vous essayez de faire ici. – freakish

+0

Donc je pense qu'il y a une différence entre mettre max_workers à 10 et le mettre à 100, non? Je ne veux pas générer de threads supplémentaires s'ils ne peuvent pas améliorer l'efficacité. – user2923419