开发者

ending the life of a thread in python?

I have the below code but it lives on after the queue is empty, any insights:

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):  
  开发者_Go百科  th = Thread(target=processor)  
    th.setDaemon(True)  
    th.start()  
   queue.join()  

It prints queue empty as many times as I have threads and just stands there doing nothing.


You need to call queue.task_done() after printing the page, otherwise join() will block. Each thread, after using get() must call task_done().

See documentation for queue


This part:

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

Above is just plain wrong. queue.get() is blocking, there is absolutely no reason to have a busy loop. It should be deleted.

Your code should look something like this.

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()  

It's not the cleanest way to exit, but it will work. Since processor threads are set to be daemons, whole process with exit as soon as the main is done.


As Max said, need a complete example to help with your behavior, but from the documentation:

Python’s Thread class supports a subset of the behavior of Java’s Thread class; currently, there are no priorities, no thread groups, and threads cannot be destroyed, stopped, suspended, resumed, or interrupted.

It stops being alive when its run() method terminates – either normally, or by raising an unhandled exception. The is_alive() method tests whether the thread is alive.

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

The lower level thread module does allow you to manually call exit(). Without a more complete example, I don't know if that's what you need in this case, but I suspect not as Thread objects should automatically end when run() is complete.

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜