2016-05-03 3 views
2

Je voudrais lancer 4 threads pour faire du travail toutes les secondes en Python. Pour m'assurer que le travail est effectué toutes les 1 s, j'ai inséré un sleep après le spawn comme indiqué dans l'extrait de code suivant. De l'impression, il semble que le nombre de fois do_work a été exécuté était 10 alors que j'attendais 10 * 4 -> le nombre d'itérations de la boucle x le nombre de threads. En outre, il semble que le premier thread commence à faire le travail après 4 secondes à partir de l'heure imprimée dans la boucle principale (j'ai imprimé l'heure aussi à l'intérieur du fil).Dormir après spawn en Python

run_pool = GreenPool(4) 
    counter = 0 
    while counter < 10: 
     run_pool.spawn(self.do_work) 
     time.sleep(1) 
     counter += 1 
     print time.time() 

Répondre

1

Le paramètre au constructeur pour GreenPool est le nombre de threads de travail qui sera utilisé. En passant le numéro 4, vous lui dites d'appeler self.do_work par un maximum de quatre fois simultanément. Puisque vous appelez le spawn dix fois, vous avez mis en file d'attente 10 "travaux", c'est ainsi que le nombre do_work sera appelé. La quantité de parallélisme (4 dans ce cas) n'affecte pas le nombre de fois que vos tâches sont exécutées, mais limite la quantité de threads pouvant s'exécuter simultanément.

2

Tout d'abord, vous devriez read the documentation pour avoir une meilleure idée de comment eventlet fonctionne et comment l'utiliser. Je n'ai moi-même jamais utilisé eventlet, tout ce qui suit, je l'ai compris en parcourant les docs pendant quelques minutes.

il semble que le nombre de fois do_work a été exécuté était de 10 alors que je m'y attendais 10 * 4

GreenPool.spawn() frayent seulement un fil par appel. La taille du pool limite le nombre de threads pouvant être exécutés simultanément. Si tous les threads du pool sont utilisés, spawn se bloquera jusqu'à ce qu'un thread soit disponible.

il semble que le premier fil commence à faire le travail après 4 secondes à partir du moment imprimé dans la boucle principale

Vous devez singe-patch le module time pour le faire céder volontairement tout contrôle en train de dormir. Puisque vous n'avez pas fait cela, les threads engendrés ne peuvent pas fonctionner tant que le thread principal est en veille. Par conséquent, les threads ne sont pas exécutés avant la quatrième itération de la boucle. À ce stade, le thread principal ne peut générer plus de threads, il "bloque" et cède le contrôle aux threads de travail. Appeler eventlet.monkey_patch() avant que votre boucle ne répare le problème. Vous pouvez également utiliser eventlet.sleep() au lieu de time.sleep().