python多线程设置traget的问题

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

你看看这个吧:
https://docs.python.org/3/library/threading.html

了解一下括号的作用就明白了。引用人家的说法就是“类带括号,类实例化,函数带括号,执行函数,返回函数的结果,否则不执行,只是调用类或函数本身。”

tread_run()加括号了就相当于要执行完这个函数,这个函数没有明显的return语句,实际就是返回None,所以target=None.没有加括号相当于把函数本身赋值给了target,你可以用print(tread_run())和print(tread_run)看看差异是什么