2011-06-03 15 views
3

我有下面的代碼,但後隊列爲空,它存在於任何見解:在Python中結束一個線程的生命?

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

它打印隊列空的,因爲很多次,因爲我有螺紋,只是站在那裏什麼都不做。

+6

請修復縮進併發佈一個完整的示例。 – NPE 2011-06-03 12:26:16

回答

4

您需要打印頁面後調用queue.task_done(),否則join()方法將阻塞。每個線程在使用get()之後都必須調用task_done()。

documentation for queue

+0

如果線程在隊列中沒有剩餘工作時死亡,則可以加入線程(而不是隊列),而無需調用task_done()。 – 2011-06-03 14:33:02

1

正如馬克斯說,需要一個完整的例子,以幫助你的行爲,但是從文檔:

Python的Thread類支持Java的Thread類的行爲的一個子集;目前沒有優先級,沒有線程組,線程不能被銷燬,停止,暫停,恢復或中斷。

它的run()方法終止時會停止活動 - 正常情況下或通過引發未處理的異常。 is_alive()方法測試線程是否處於活動狀態。

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

較低級的線程模塊不會讓您手動調用exit()。沒有一個更完整的例子,我不知道在這種情況下你是否需要這樣做,但是我懷疑當run()完成時,Thread對象不應該自動結束。

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

+0

而使用Python的建議是使用多處理而不是多線程,是不是(對於非I/O密集型任務,至少)?由於全局解釋器鎖定,即使您在不同處理器上執行它們,多個線程也不會實際併發運行。我想這對Max來說並不重要,因爲他會有很多I/O等待。 – JAB 2011-06-03 13:54:19

+0

@JAB據我所知,這是正確的。 – Jacinda 2011-06-04 04:04:50

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之後立即退出整個進程。

相關問題