2016-06-10 113 views
0

我有一個數組充滿了命令,我想同時執行所有的命令。在Python中動態創建函數和線程

到目前爲止,我有:

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() 

雖然這仍然是可以接受的,如果只有兩個線程(它似乎工作,至少),它肯定不是,如果commandArray的長度是未知在運行時。我如何高效地爲x個線程執行此操作?

PS:這是完全可能的,因爲我是多線程新手,所有這些都是垃圾。建設性的批評是高度讚賞。

+2

對於初學者來說,你不希望'()'創建線程時的函數的名字後。這將在該行被評估之前調用該函數。 – DeepSpace

回答

1

如果我正確理解你的問題,它應該是這樣的:

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() 

需要注意的是:

  1. 的通行證run_it_boy代替run_it_boy(),因爲你不想現在就調用它,但讓線程模塊去做。
  2. 鼓勵將snake_case用於函數/方法名稱和變量名稱,CamelCase用於類名稱。

替代

在我看來,最好是使用一種叫做線程池。

+1

'.start()'不返回任何東西,所以賦值是無用的。 – DeepSpace

+0

@DeepSpace謝謝 – BornToCode

0

對於初學者來說,創建線程時不希望()在函數名稱後面。這將在該行被評估之前調用該函數。

其次,.start()不會返回任何內容,因此您對t1t2的分配無用。

你可以做的是什麼,而且是更加動態,然後你的代碼,是沿着這些線路的東西:

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] 

這是假設,當然,你希望每個線程執行不同的功能。

然後啓動線程:

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

這並沒有絲毫解決我的問題,我不認爲你完全理解我的問題。我不想寫出這些函數/線程,因爲我不知道我需要多少(例如,你使用3,但也可能是20)。 – VeronicaLatLng