我有一个充满命令的数组,我想同时执行所有命令。
到目前为止,我有:
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:完全有可能所有这些都是垃圾,因为我是多线程的新手。建设性批评受到高度赞赏。答案 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()
请注意:
run_it_boy
代替run_it_boy()
,因为您现在不想调用它,但让线程模块执行此操作。snake_case
作为函数/方法名称和变量名称,CamelCase
用于类名。<强>替代强>
在我看来,最好使用一种称为线程池的东西。
答案 1 :(得分:0)
对于初学者来说,在功能之后你不想要()
。创建线程时的名称。这将在评估线之前调用该函数。
其次,.start()
不会返回任何内容,因此您对t1
和t2
的分配毫无用处。
你可以做的是,并且比你拥有的代码更具动态性,是这些内容:
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()