2011-08-16 113 views
1

我打算使用python的线程/队列2.5.2 但似乎python冻结在queue.join() - 命令。 的followong代码的输出仅仅是:BEFOREPython中的线程/队列

import Queue 
import threading 

queue = Queue.Queue() 

class ThreadUrl(threading.Thread): 

    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while True: 

      i = self.queue.get() 
      print i 
      self.queue.task_done() 


def main(): 

    for i in range(5): 
     t = ThreadUrl(queue) 
     t.setDaemon(True) 
     t.start() 

    for i in range(5): 
     queue.put(i) 

    print "BEFORE" 
    queue.join() 
    print "AFTER" 


main() 

有某人什么错误的想法?

+0

queue.put(1)...不是说这是解决方案。但只是检查编号(队列)是相同的所有功能...如果没有,然后使用全局队列的功能... –

+0

这适用于我在Python上使用Python 2.6.6 –

+0

此代码看起来非常完美,我整天阅读这些东西:\ –

回答

0

您的ThreadUrl类的run()方法缩进得太远了。线程永远不会启动。如果将运行方法的缩进与init()的缩进级别相同,则它将正常工作。

+0

感谢您的提示。但是现在在调用queue.put(i)命令之后,第一个(有时候是第二个)时间python会崩溃....!? – MultiQueue

+0

崩溃如何?一个标准的异常或它与信号(SEGV)一起死亡? – brandx

+0

IDLE冻结,然后由任务管理器关闭窗口。 – MultiQueue

0

的解决方案,我现在发现是:

不要使用Python 2.5.2! 如果使用Python 2.7.2代替上面的代码运行得很好。

谢谢大家!

0

我认为这是t.setDaemon(True)部分。

所以> 2.6

t.setDaemon(真)

< 2.6

t.daemon =真

0

使用守护进程=真。这将确保您的线程在主函数执行后退出。