2016-12-04 57 views
0
import threading 
这个功能我想要做我的编码的东西为每个线程,但只有mainthread进入线程的这个功能没有已经在主函数创建

进入此功能为什么只有MainThread达到我的功能?

def enrich(): 
    for i in range(10): 
     print(threading.current_thread().getName()) 



def main(): 
    Thread_0 = threading.Thread(target=enrich()) 
    Thread_1 = threading.Thread(target=enrich()) 
    Thread_2 = threading.Thread(target=enrich()) 
    Thread_3 = threading.Thread(target=enrich()) 
    Thread_4 = threading.Thread(target=enrich()) 
    Thread_5 = threading.Thread(target=enrich()) 
    Thread_6 = threading.Thread(target=enrich()) 
    Thread_7 = threading.Thread(target=enrich()) 

    Thread_0.setName('0') 
    Thread_1.setName('1') 
    Thread_2.setName('2') 
    Thread_3.setName('3') 
    Thread_4.setName('4') 
    Thread_5.setName('5') 
    Thread_6.setName('6') 
    Thread_7.setName('7') 

    Thread_0.start() 
    Thread_1.start() 
    Thread_2.start() 
    Thread_3.start() 
    Thread_4.start() 
    Thread_5.start() 
    Thread_6.start() 
    Thread_7.start() 

    Thread_0.join() 
    Thread_1.join() 
    Thread_2.join() 
    Thread_3.join() 
    Thread_4.join() 
    Thread_5.join() 
    Thread_6.join() 
    Thread_7.join() 
    if __name__ == "__main__": main() 

输出我得到这样的:

C:\Users\Danial\AppData\Local\Programs\Python\Python35\python.exe "D:/iaun/Final Project/FileTermsInfo/test.py" 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 

回答

1

这是你的问题:

Thread_0 = threading.Thread(target=enrich()) 

这里你是,调用你的enrich()函数,而不是将该函数的引用传递给Thread构造函数。自然,这发生在主线程上,因为还没有其他线程。该函数返回None,因此实际上在构造函数中指定target=None,并且没有任何线程接收到要调用的函数的引用。结果,他们都没有做任何事情。在创建单个线程之前,所有对enrich()的调用都会发生,并且它们会按顺序发生,而不是并行发生。

传递的功能,而不是它的结果是:

Thread_0 = threading.Thread(target=enrich) 

27:11你的其他线程。

此外,sheesh,使用列表而不是单个变量的线程。没有理由让所有的代码在少数几行中做你能做的事情。

threads = [threading.Thread(target=enrich, name=str(x)) for x in range(8)] 
for thread in threads: 
    thread.start() 
for thread in threads: 
    thread.join() 
+0

非常感谢kindall我想确保我做万物的权利,这就是为什么我时,我想通过一些变量作为输入函数没有使用列表 – danitiger33

+0

什么情况呢? – danitiger33

+0

这就是构造函数的'args'参数。或者在某些情况下,使用lambda或'functools.partial'可能会更方便。 – kindall