在python中结束一个线程的生命?

时间:2011-06-03 12:23:54

标签: python multithreading

我有以下代码,但它在队列为空后仍然存在,任何见解:

def processor():
   while(1>0):
    if queue.empty() == True:  
    print "the Queue is empty!"  
    break
   source=queue.get()
   page = urllib2.urlopen(source)
   print page   

def main:
   for i in range(threads):  
    th = Thread(target=processor)  
    th.setDaemon(True)  
    th.start()  
   queue.join()  

它打印队列空了很多次,就像我有线程一样,只是站在那里什么都不做。

3 个答案:

答案 0 :(得分:4)

打印页面后需要调用queue.task_done(),否则join()会阻塞。使用get()后,每个线程都必须调用task_done()。

请参阅documentation for queue

答案 1 :(得分:3)

这部分:

   while(1>0):
    if queue.empty() == True:  
    print "the Queue is empty!"  
    break

上面只是简单的错误queue.get()正在阻止,绝对没有理由拥有busy loop。它应该被删除。

您的代码看起来应该是这样的。

def processor():
   source=queue.get()
   page = urllib2.urlopen(source)
   print page   
   queue.task_done()

def main:
   for i in range(threads):  
    th = Thread(target=processor)  
    th.setDaemon(True)  
    th.start()  
   for source in all_sources:
    queue.put(source)
   queue.join()  

这不是退出的最干净的方式,但它会起作用。由于处理器线程被设置为守护进程,因此只要main完成就会退出整个进程。

答案 2 :(得分:1)

正如Max所说,需要一个完整的例子来帮助你的行为,但是从文档中可以看出:

  

Python的Thread类支持Java Thread类的行为的子集;目前,没有优先级,没有线程组,线程不能被销毁,停止,暂停,恢复或中断。

     

当run()方法终止时,它会停止活动 - 正常或通过引发未处理的异常。 is_alive()方法测试线程是否存活。

http://docs.python.org/library/threading.html

较低级别的线程模块允许您手动调用exit()。如果没有更完整的示例,我不知道在这种情况下这是否是您需要的,但我怀疑不会因为Thread对象在run()完成时自动结束。

http://docs.python.org/library/thread.html