2017-07-15 13 views
5

Ich bin Intermediate Biene für Python und würde gerne die gleiche Klasse Instanzen von wenigen im parallelen Modus zum Abrufen von Daten und Entscheidungsfindung für den Finanzmarkt. Um meine Idee fortzuführen, führe ich den folgenden Code aus, um zu sehen, wie Python funktioniert, es scheint, als würde es einen kompletten Lauf der ersten Instanz ausführen und nach Instanzen der zweiten Klasse möchte ich das parallel ausführen, wie kann ich ...? unten ist das ein Beispielcode zum Testen ..Python Threading nicht parallel bearbeitet

import threading 
import time 

class thr(object): 

    def __init__(self, name): 
    self.name = name 
    self.x = 0 

    def run(self): 
    for i in list(range(10)): 
     self.x +=1 
     print("something {0} {1}".format(self.name, self.x)) 
     time.sleep(1)    

F = thr("First") 
S = thr("Second") 

threading.Thread(target=F.run()) 
threading.Thread(target=S.run()) 

und die wie unten Ergebnisse ....

something First 1 
something First 2 
something First 3 
something First 4 
something First 5 
something First 6 
something First 7 
something First 8 
something First 9 
something First 10 
something Second 1 
something Second 2 
something Second 3 
something Second 4 
something Second 5 
something Second 6 
something Second 7 
something Second 8 
something Second 9 
something Second 10 
Out[27]: <Thread(Thread-25, initial)> 

Antwort

8

Das Problem dabei ist:

threading.Thread(target=F.run()) 
threading.Thread(target=S.run()) 

target= eine aufrufbare nimmt Objekt oder None. F.run()führt sofortF.run aus, wartet auf den Abschluss und übergibt dann den Rückgabewert (None in Ihrer run()-Methode) als Ziel.

Sie wollen so etwas wie diese stattdessen:

t1 = threading.Thread(target=F.run) 
t2 = threading.Thread(target=S.run) 
t1.start() 
t2.start() 

Hinweis, dass es keine Klammern nach run

Hier ist das komplette Programm mit der vorgeschlagenen Änderung:

import threading 
import time 

class thr(object): 

    def __init__(self, name): 
    self.name = name 
    self.x = 0 

    def run(self): 
    for i in list(range(10)): 
     self.x +=1 
     print("something {0} {1}".format(self.name, self.x)) 
     time.sleep(1)    

F = thr("First") 
S = thr("Second") 

t1 = threading.Thread(target=F.run) 
t2 = threading.Thread(target=S.run) 
t1.start() 
t2.start() 

Und Ausgang (Python 3.6 .1):

$ python sf.py 
something First 1 
something Second 1 
something Second 2 
something First 2 
something Second 3 
something First 3 
something Second 4 
something First 4 
something Second 5 
something First 5 
something Second 6 
something First 6 
something Second 7 
something First 7 
something First 8 
something Second 8 
something First 9 
something Second 9 
something First 10 
something Second 10 
+0

Für wen auch immer heruntergeregelt wird: Nehmen Sie die vorgeschlagene Änderung vor, und führen Sie den Code tatsächlich aus. Es löst das angegebene Problem des OP und genau aus dem Grund, den ich gegeben habe. –

+0

Das ist ganz offensichtlich die richtige Antwort .. – thebjorn

+1

Ja, das ist - aber leider kann jeder abstimmen ;-) –