队列阻塞主线程

时间:2017-04-17 16:53:51

标签: python multithreading python-2.7 queue

我有3个项目的for循环。在for循环内,对于每个项目,我生成了15个线程。这些都会将数据返回给我的GUI,但是会发生for循环执行,所有3个项目都会运行,并生成45个线程。我正在尝试运行第一项,等到15个线程完成,然后运行第二个项目。我需要在不使用join()的情况下完成所有这些操作。

我认为这可以通过queue完成,但在阻止时遇到问题。当我尝试以下操作时,它永远不会移动到第二组15个线程:

while True:
    try:
        data = q.get(False)
    except Query.Empty():
        data = None

这可以阻止阻塞问题并使用15个线程中的每个线程执行的功能不断更新GUI,但是一旦执行,它就会结束并且不会继续for循环。这是有问题的循环:

def thing_1(names):
    def thready():
        print "Hello!"
        q.put("Done")
    for name in names:
        print "Working on " + name
        t1 = threading.Thread(target=thready)
        t1.start()
        # Then put 'while True' here

1 个答案:

答案 0 :(得分:0)

当活动线程数下降到1时(假设您没有任何其他线程处于活动状态),可以通过中断while True循环来轻松解决这个问题。尝试

while True:
    try:
        data = q.get(False)
    except Query.Empty():
        data = None
    if threading.active_count() == 1:
        break

您可以使用现在拥有的相同循环体,但将while条件更改为

while threading.active_count() > 1: