我在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之前启动下一个线程回?
我对线程有点新意,所以请解释一切。
答案 0 :(得分:3)
Thread
构造函数只是一个普通的函数调用;它的所有参数,包括args
元组,都必须在它被调用之前进行评估。
所以,这是在主线程中执行longfunction(a, b)
,并且只在后台线程中执行queue.extend
。
解决此问题的最快方法是使用def
或lambda
创建一个线程函数:
Thread(target=lambda: queue.extend(longfunction(a, b)).start()
或者,或者:
Thread(target=(lambda x, y: queue.extend(longfunction(x, y)), args=(a, b)).start()
不同之处在于第一个是闭包,从本地环境捕获a
和b
,所以如果它们在评估lambda时已经改变,你将得到新的值,而第二个不是*,所以它在创建args元组时得到a
和b
的值。在大多数情况下,这无关紧要。当它重要时,你必须考虑你想要的那个。
*从技术上讲,闭包和函数在Python中是相同的;它只是一个没有细胞的封闭物,而不是一个有两个细胞的封闭物。
答案 1 :(得分:0)
是的,它会在启动线程之前等待它返回。这是因为当您将()
添加到函数末尾时,它不再是函数引用,而是函数调用。因此,args=(longfunction(a,b))
将在主线程中被评估为args=(return_from_long_function,)
,然后该值将传递给线程目标,在这种情况下:queue.extend
。