2016-06-10 12 views
0

Ich habe ein Array mit Befehlen gefüllt und ich möchte alle Befehle zur gleichen Zeit ausführen.Dynamisch erstellen Funktionen und Threads in Python

Bisher habe ich:

import threading 

... 

def MyThread0(): 
    exec commandArray[0] 

def MyThread1(): 
    exec commandArray[1] 

t1 = threading.Thread(target=MyThread0(), args=[]).start() 
t2 = threading.Thread(target=MyThread1(), args=[]).start() 

Während dies noch akzeptabel sein, wenn es nur zwei Threads (es scheint, zumindest zu arbeiten), ist es sicherlich nicht, wenn die Länge des commandArray unbekannt ist zur Laufzeit. Wie mache ich das effizient für x Anzahl der Threads?

PS: Es ist durchaus möglich, dass all dies Junk ist, da ich Multithreading neu bin. Konstruktive Kritik wird sehr geschätzt.

import threading 

... 

def run_it_boy(index): 
    exec command_array[index] 

for i in range(number_of_commands):  
    t[i] = threading.Thread(target=run_it_boy, args=(i,)) 
    t[i].start() 

Beachten Sie, dass:

+2

Für den Anfang, Sie mögen nicht die '()' nach den Namen der Funktionen, wenn die Fäden zu schaffen. Dadurch wird die Funktion aufgerufen, bevor die Zeile ausgewertet wird. – DeepSpace

Antwort

1

Wenn ich Ihr Problem richtig verstanden habe, es so sein sollte

  1. Pass run_it_boy statt run_it_boy(), weil Sie nicht wollen, es nennen jetzt, aber lass das Threading-Modul machen.
  2. Es wird empfohlen, snake_case für Funktion/Methodenname und Variablenname zu verwenden, CamelCase ist für Klassenname.

Alternative

Meiner Meinung nach ist es besser, etwas Thread-Pool genannt zu verwenden.

+1

'.start()' gibt nichts zurück, daher ist die Zuweisung nutzlos. – DeepSpace

+0

@DeepSpace Danke – BornToCode

0

Für den Anfang wollen Sie nicht die () nach den Namen der Funktionen beim Erstellen der Threads. Dadurch wird die Funktion aufgerufen, bevor die Zeile ausgewertet wird.

Zweitens gibt .start() nichts zurück, so dass Ihre Zuweisungen zu t1 und t2 nutzlos sind.

Was Sie tun können, ist, und ist ein bisschen dynamischer dann der Code, den Sie haben, etwas entlang der diese Linie ist:

import threading 

def func1(): 
    pass 

def func2(): 
    pass 

def func3(): 
    pass 

funcs_to_run = [func1, func2, func3] 

threads = [threading.Thread(target=func, args=[]) for func in funcs_to_run] 

Dies natürlich unter der Annahme, dass Sie jeder Thread wollen einen anderen auszuführen Funktion.

dann die Fäden zu starten:

for thread in threads: 
    thread.start() 
+0

Das löst mein Problem nicht im Geringsten, ich glaube nicht, dass Sie mein Problem überhaupt verstanden haben. Ich möchte diese Funktionen/Threads nicht schreiben, weil ich nicht weiß, wie viele ich brauche (z. B. hast du 3 verwendet, aber es könnte auch 20 sein). – VeronicaLatLng