2016-05-02 44 views
0

Ich habe eine Reihe von Klassen, die in einer Reihe und parallel erben und ich muss Python-Threading für alle Klassen verwenden, wenn möglich. Ein Beispiel ist unten. Das Problem ist, dass die Build-Klasse nicht ihre Ausführungsfunktion ausführt, die eine Methode in der Thread-Klasse ist. Threading funktioniert in der MyThread-Klasse jedoch einwandfrei. Irgendeine Idee, wie die Build-Klasse als Thread gestartet wird?Python Threading in mehreren Unterklassen

from threading import Thread 
from random import randint 
import time 

class Build(Thread): 
    def __init__(self): 
     Thread.__init__(self) 

    def run(self):  
     # This run function currently not being executed 
     for i in range(20): 
      print('Second series %i in thread' % (i)) 
      time.sleep(1) 

class MyThread(Build, Thread): 

    def __init__(self, val): 
     ''' Constructor. ''' 
     Thread.__init__(self) 
     Build.__init__(self) 

     self.val = val 


    def run(self): 
     for i in range(1, self.val): 
      print('Value %d in thread %s' % (i, self.getName())) 

      # Sleep for random time between 1 ~ 3 second 
      secondsToSleep = randint(1, 5) 
      print('%s sleeping fo %d seconds...' % (self.getName(), secondsToSleep)) 
      time.sleep(secondsToSleep) 


# Run following code when the program starts 
if __name__ == '__main__': 
    # Declare objects of MyThread class 
    myThreadOb1 = MyThread(4) 
    myThreadOb1.setName('Thread 1') 

    myThreadOb2 = MyThread(4) 
    myThreadOb2.setName('Thread 2') 

    # Start running the threads! 
    myThreadOb1.start() 
    myThreadOb2.start() 

    # Wait for the threads to finish... 
    myThreadOb1.join() 
    myThreadOb2.join() 

    print('Main Terminating...')` 
+0

scheint zu funktionieren. Ich habe versucht, den Code und ersetzt einen der 'MyThread()' mit 'Build()' und es wurde richtig Aufrufen der 'run()'. – WreckeR

Antwort

0

FYI: Statt Subklassifizieren threading.Thread der bessere Weg zu erreichen, was Sie wollen, ist Ihre Klassen zu machen Callable und geben sie nicht nur auf die target Stichwort arg der Thread Klasse Konstruktor. Der Vorteil dabei ist, dass Sie zusätzliche Argumente für jede Thread-Instanz übergeben können.

mit Ihrem Beispielcode geht.

class MyThread(Build): 

    def __init__(self): 
     ''' Constructor. ''' 
     Build.__init__(self) 

     self.val = val 

    # this allows your class to be a callable. 
    def __call__(self, val): 
     for i in range(1, val): 
      print('Value %d in thread %s' % (i, self.getName())) 

      # Sleep for random time between 1 ~ 3 second 
      secondsToSleep = randint(1, 5) 
      print('%s sleeping fo %d seconds...' % (self.getName(), secondsToSleep)) 
      time.sleep(secondsToSleep) 

# Run following code when the program starts 
if __name__ == '__main__': 
    # Declare objects of MyThread class 
    myThreadObj1 = MyThread() 
    myThread1 = Thread(target=myThreadOb1, args=(4)) 
    myThread1.start()