我有以下代码,但它在队列为空后仍然存在,任何见解:
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()
它打印队列空了很多次,就像我有线程一样,只是站在那里什么都不做。
答案 0 :(得分:4)
打印页面后需要调用queue.task_done(),否则join()会阻塞。使用get()后,每个线程都必须调用task_done()。
答案 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()完成时自动结束。