2017-02-02 6 views
0

Ich bin neu in Python und Threading. Ich versuche mehrere Threads gleichzeitig auszuführen. Hier ist mein Grundcode:Threads laufen nicht parallel in Python-Skript

import threading 
    import time 
    threads = [] 

    print "hello" 

    class myThread(threading.Thread): 
      def __init__(self,i): 
        threading.Thread.__init__(self) 
        print "i = ",i 
        for j in range(0,i): 
          print "j = ",j 
          time.sleep(5) 

    for i in range(1,4): 
      thread = myThread(i) 
      thread.start() 

Während 1 Thread für time.sleep(5) wartet ich will ein anderer Thread zu starten. Kurz gesagt, alle Threads sollten parallel laufen.

+0

Afaik, Threads in Python laufen alle auf einem ** single core **. Das einzige, was Threads tun können, ist, den CPU-Burst sozusagen zu erhöhen. Sie benötigen die 'Multiprocessing'-Bibliothek, die neue Prozesse startet, um mehr als einen einzelnen Kern zu erhalten. –

+0

Wenn der Thread-Thread aufgebaut ist, ist es auf dem gleichen Thread. Wenn Sie möchten, dass Ihr Code ordnungsgemäß ausgeführt wird, sollten Sie Ihr 'time.sleep 'in der' run'-Methode und nicht im Konstruktor angeben. – n00dl3

+0

Sie können sich [this antwort] (http://stackoverflow.com/a/18963931/4124317) zum Thema 'threading' anschauen. Sie müssen 'Thread' grundsätzlich nicht ableiten, aber wenn Sie dies tun, verwenden Sie den Konstruktor' __init __() 'nicht, um Aufgaben auszuführen, die mit Threads versehen werden sollten. – ImportanceOfBeingErnest

Antwort

2

Sie könnten einige Missverständnisse haben, wie threading.Thread, allen voran __init__() Methode Unterklasse ist etwa, was einen Konstruktor stellt in Python, im Grunde wird es jedes Mal ausgeführt werden, wenn Sie eine Instanz erstellen, in Ihrem Fall, wenn thread = myThread(i) ausgeführt wird, wird es bis Ende __init__() blockieren.

Dann sollten Sie Ihre Aktivitäten in run() bewegen, so dass, wenn start() aufgerufen wird, wird der Faden zu laufen. Zum Beispiel:

import threading 
import time 
threads = [] 

print "hello" 

class myThread(threading.Thread): 
    def __init__(self, i): 
     threading.Thread.__init__(self) 
     self.i = i 

    def run(self): 
     print "i = ", self.i 
     for j in range(0, self.i): 
      print "j = ",j 
      time.sleep(5) 

for i in range(1,4): 
    thread = myThread(i) 
    thread.start() 

P.S. Aufgrund der Existenz von GIL in CPython sind Sie möglicherweise nicht in der Lage, alle Ihre Prozessoren vollständig zu nutzen, wenn die Task CPU-gebunden ist.

+0

Es funktioniert und ich verstehe endlich, wie es funktioniert. Danke vielmals. –

1

Hier ist ein Beispiel, wie Sie Threading basierend auf Ihren Code verwenden:

import threading 
import time 
threads = [] 

print "hello" 

def doWork(i): 
    print "i = ",i 
    for j in range(0,i): 
     print "j = ",j 
     time.sleep(5) 

for i in range(1,4): 
    thread = threading.Thread(target=doWork, args=(i,)) 
    threads.append(thread) 
    thread.start() 

# you need to wait for the threads to finish 
for thread in threads: 
    thread.join() 

print "Finished" 
+0

Es hat funktioniert. Danke für Ihre Hilfe –

Verwandte Themen