Python线程:是否并行传递给线程的参数?

时间:2013-11-21 23:24:44

标签: python multithreading

我在python中有一个函数调用,如下所示:

from threading import Thread
while queue:
   Thread(target=queue.extend, args=(longfunction(a, b))).start()

所以我认为上面的代码并行运行几个queue.extend函数,但它不会等到前一个queue.extend在开始下一个queue.extend之前返回。但我不确定这些论点。

我的问题是,Python是否等待longfunction(a,b)完成评估并在继续开始新线程之前返回,或者是整个线程立即启动然后在longfunction之前启动下一个线程回?

我对线程有点新意,所以请解释一切。

2 个答案:

答案 0 :(得分:3)

Thread构造函数只是一个普通的函数调用;它的所有参数,包括args元组,都必须在它被调用之前进行评估。

所以,这是在主线程中执行longfunction(a, b),并且只在后台线程中执行queue.extend

解决此问题的最快方法是使用deflambda创建一个线程函数:

Thread(target=lambda: queue.extend(longfunction(a, b)).start()

或者,或者:

Thread(target=(lambda x, y: queue.extend(longfunction(x, y)), args=(a, b)).start()

不同之处在于第一个是闭包,从本地环境捕获ab,所以如果它们在评估lambda时已经改变,你将得到新的值,而第二个不是*,所以它在创建args元组时得到ab的值。在大多数情况下,这无关紧要。当它重要时,你必须考虑你想要的那个。


*从技术上讲,闭包和函数在Python中是相同的;它只是一个没有细胞的封闭物,而不是一个有两个细胞的封闭物。

答案 1 :(得分:0)

是的,它会在启动线程之前等待它返回。这是因为当您将()添加到函数末尾时,它不再是函数引用,而是函数调用。因此,args=(longfunction(a,b))将在主线程中被评估为args=(return_from_long_function,),然后该值将传递给线程目标,在这种情况下:queue.extend