python多线程设置traget的问题
问题描述:
import threading
import time
def thread_run():
print("frist")
for i in range(10):
time.sleep(1)
print("frist finish")
def main():
add_thread=threading.Thread(target=thread_run)#target后面换成tread_run()加括号了为什么会不一样
add_thread.start()
print("second")
if __name__ == '__main__':
main()
答
这个问题还是比较基础啊,它的重点是Thread构造函数中需要给的target参数要求是一个callable对象。
在Thread内部有一个run函数,运行target指向的方法。这个才是重点。
什么时候可以给个加括弧的,如果thread_run内部改造为类似下面的callable_generator返回的是一个函数, 如下代码。那么你可以传入target=callable_generator(),否则thread_run()返回值是None。
def callable_generator():
print("execute immediately")
def run():
time.sleep(1)
print("call in run")
return run
答
了解一下括号的作用就明白了。引用人家的说法就是“类带括号,类实例化,函数带括号,执行函数,返回函数的结果,否则不执行,只是调用类或函数本身。”
答
tread_run()加括号了就相当于要执行完这个函数,这个函数没有明显的return语句,实际就是返回None,所以target=None.没有加括号相当于把函数本身赋值给了target,你可以用print(tread_run())和print(tread_run)看看差异是什么