在Python中动态创建函数和线程

问题描述:

我有一个数组充满了命令,我想同时执行所有的命令。在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

如果我正确理解你的问题,它应该是这样的:

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

对于初学者来说,创建线程时不希望()在函数名称后面。这将在该行被评估之前调用该函数。

其次,.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