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

时间:2016-06-10 14:35:36

标签: python multithreading python-2.7

我有一个充满命令的数组,我想同时执行所有命令。

到目前为止,我有:

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 个答案:

答案 0 :(得分:2)

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

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用于类名。
  3. <强>替代

    在我看来,最好使用一种称为线程池的东西。

答案 1 :(得分: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()