2017-04-17 196 views
0

我有一个for循环3项。在for循环内,我为每个项目生成了15个线程。这些都将数据返回到我的GUI,但会发生什么情况是执行for循环,所有3个项目并贯穿始终,并且会产生45个线程。我试图运行第一个项目,等到15个线程完成,然后运行第二个项目。我需要做所有这些,而不使用join()队列阻塞主线程

我想这可以通过queue完成,但有阻塞的问题。当我尝试以下,它永远不会移动到第二组的15个线程:

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

这将停止阻塞问题,使我的GUI与每个15个线程执行的功能不断更新,但一旦他们执行,它只是结束并且不会继续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 

回答

0

这可以很容易地通过打破while True循环来解决,当活动线程的数量下降到1(假设你没有任何其他线程激活)。尝试

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

您可能会改用你现在有相同的循环体,但改变而条件

while threading.active_count() > 1: 
+0

你也可以考虑增加一个小的(25毫秒?)睡眠进入while循环,以避免您的GUI线程占用了太多的CPU时间。 – holdenweb

+0

似乎是超越'except'部分的问题。如果我用'print'Hello'''替换新的if语句,它甚至不会打印。 –

+0

听起来可能你已经在你的代码中混淆了缩进,但是示例上下文并不足以决定。 while循环应该和上面的for循环相同。通过插入'print'调用来检查while循环实际上是否按照您的想法运行。 – holdenweb