2009-09-21 4 views
3

J'ai rencontré quelques exemples de gestion de threads avec le module de thread (en utilisant Python 2.6). Ce que j'essaie de comprendre, c'est comment cet exemple appelle la méthode "run" et où. Je ne le vois nulle part. La classe ThreadUrl est instanciée dans la fonction main() en tant que "t" et c'est là que je m'attendrais normalement à ce que le code démarre la méthode "run".Contrôle de flux dans threading.Thread

Peut-être que ce n'est pas la manière préférée de travailler avec des threads? S'il vous plaît me éclairer:

#!/usr/bin/env python 

import Queue 
import time 
import urllib2 
import threading 
import datetime 

hosts = ["http://example.com/", "http://www.google.com"] 

queue = Queue.Queue() 

class ThreadUrl(threading.Thread): 
    """Threaded Url Grab""" 
    def __init__(self, queue): 
      threading.Thread.__init__(self) 
      self.queue = queue 

    def run(self): 
      while True: 
        #grabs host from queue 
        host = self.queue.get() 

        #grabs urls of hosts and prints first 1024 bytes of page 
        url = urllib2.urlopen(host) 
        print url.read(10) 

        #signals to queue job is done 
        self.queue.task_done() 

start = time.time() 

def main(): 

    #spawn a pool of threads, and pass them queue instance 
    for i in range(1): 
      t = ThreadUrl(queue) 
      t.setDaemon(True) 
      t.start() 

      for host in hosts: 
        queue.put(host) 

    queue.join() 
main() 
print "Elapsed time: %s" % (time.time() - start) 

Répondre

7

par le pydoc:

Thread.start()

Démarrer l'activité de fil.

Il doit être appelé au plus une fois par objet de fil. Il fait en sorte que la méthode run() de l'objet soit appelée dans un thread de contrôle distinct.

Cette méthode déclenchera une exception RuntimeException si elle est appelée plus de une fois sur le même objet de thread.

La façon de penser python objets Thread est qu'ils prennent un certain morceau de code python qui est écrit de manière synchrone (soit dans la méthode run ou via l'argument target) et l'envelopper dans du code C qui sait faites-le fonctionner de manière asynchrone. La beauté de ceci est que vous obtenez de traiter start comme une méthode opaque: vous n'avez aucune entreprise l'écrasant à moins que vous ne réécriviez la classe en C, mais vous obtenez de traiter très concrètement run. Cela peut être utile si, par exemple, vous voulez tester la logique de votre thread de manière synchrone. Tout ce dont vous avez besoin est d'appeler t.run() et il sera exécuté comme n'importe quelle autre méthode.

+0

Merci pour la grande réponse, j'ai échoué à regarder les docs. – alfredodeza

4

La méthode run() est appelée derrière la scène par "threading.Thread" (héritage de Google et les concepts de polymorphisme de la POO). L'invocation sera faite juste après que t.start() a appelé.

Si vous avez un accès à threading.py (trouvez-le dans le dossier python). Vous verrez un nom de classe Thread. Dans cette classe, il existe une méthode appelée "start()". start() appelé '_start_new_thread (self _ _ bootstrap,())' un démarrage de threads de bas niveau qui exécutera une méthode wrapper appelée '_ _ bootstrap()' par un nouveau thread. '_ _ bootstrap()', alors, appelé '_ _ bootstrap_inner()' qui fait un peu plus de préparation avant, enfin, appelle 'run()'.

Lire la source, vous pouvez en apprendre beaucoup. : D

+0

+1 C'est magique. Si vous utilisez des threads, essayez les threads PyQt, car ils sont plus optimisés et permettent aux signaux/slots de communiquer entre les threads. – Chazadanga

0

t.start() crée un nouveau thread dans le système d'exploitation et quand ce fil commence il appeler la méthode run() du fil (ou une autre fonction si vous fournissez un target dans le constructeur Thread)

Questions connexes