【问题标题】:why only MainThread reaches my function?为什么只有 MainThread 达到我的功能?
【发布时间】:2016-12-04 07:51:47
【问题描述】:
import threading

在这个函数中,我想为每个线程做我的编码工作,但是只有主线程进入这个函数,在主函数中创建的线程都没有进入这个函数

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

【问题讨论】:

    标签: python parallel-processing python-multithreading


    【解决方案1】:

    这是你的问题:

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

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

    传递函数,而不是结果:

    Thread_0 = threading.Thread(target=enrich)
    

    对于您的其他线程也是如此。

    另外,哎呀,线程使用列表而不是单个变量。没有理由让所有代码完成几行代码就能完成的事情。

    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()
    

    【讨论】:

    • 非常感谢,我想确保我所做的一切都是正确的,这就是我没有使用列表的原因
    • 当我想将一些变量作为输入传递给函数时,情况如何?
    • 这就是构造函数的args 参数的用途。或者在某些情况下,使用 lambda 或 functools.partial 可能更方便。
    • 你的意思是我应该这样做:threading.Thread(target=enrich, name=str(x), args=(a,b))
    • 这正是我的想法。
    猜你喜欢
    • 2016-09-26
    • 2013-11-21
    • 2019-12-21
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多