マルチスレッド。スレッド内の例外

を理解しようとしています。コードは次のとおりです:

import Queue
import threading
import urllib2
import time
from BeautifulSoup import BeautifulSoup

hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com",
"http://ibm.com", "http://apple.com"]

queue = Queue.Queue()
out_queue = Queue.Queue()

class ThreadUrl(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue, out_queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.out_queue = out_queue

    def run(self):
        while True:
            #grabs host from queue
            host = self.queue.get()

            #grabs urls of hosts and then grabs chunk of webpage
            url = urllib2.urlopen(host)
            chunk = url.read()

            #place chunk into out queue
            self.out_queue.put(chunk)

            #signals to queue job is done
            self.queue.task_done()

class DatamineThread(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, out_queue):
        threading.Thread.__init__(self)
        self.out_queue = out_queue

    def run(self):
        while True:
            #grabs host from queue
            chunk = self.out_queue.get()

            #parse the chunk
            soup = BeautifulSoup(chunk)
            print soup.findAll(['title'])

            #signals to queue job is done
            self.out_queue.task_done()

start = time.time()
def main():

    #spawn a pool of threads, and pass them queue instance
    for i in range(5):
        t = ThreadUrl(queue, out_queue)
        t.setDaemon(True)
        t.start()

    #populate queue with data
    for host in hosts:
        queue.put(host)

    for i in range(5):
        dt = DatamineThread(out_queue)
        dt.setDaemon(True)
        dt.start()


    #wait on the queue until everything has been processed
    queue.join()
    out_queue.join()

main()
print "Elapsed Time: %s" % (time.time() - start)

時には私はここでこのエラーが発生します:

スレッド10の例外(インタープリタのシャットダウン時に発生する可能性が高い)

何が原因なのか説明してください。

別の著者による更新:

私が似たようなコードで見る完全な例外は次のとおりです。

Exception in thread Thread-1 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/threading.py", line 552, in __bootstrap_inner
  File "/usr/local/lib/python2.7/threading.py", line 505, in run
  File "mine.py", line 86, in run
  File "/usr/local/lib/python2.7/Queue.py", line 168, in get
  File "/usr/local/lib/python2.7/threading.py", line 237, in wait
: 'NoneType' object is not callable
4
追加された 編集された
ビュー: 2
人々があなたをより喜んで支援する方法のいくつかのアイデア:1.問題を診断するために行ったことと、あなたの努力が失敗した理由を説明します。 2.エラーが発生するのに必要な最小限のコードを減らしてください。 3.エラーの完全なトレースバックを行います。
追加された 著者 Sven Marnach,
同様のコードで同じエラーが表示されます。私は上記の完全な例外を追加します。
追加された 著者 Ry4an Brase,
multiprocessing.Poolクラスを使用しているときにこのエラーが発生することがあります。インタプリタがシャットダウン中に物事を削除し始めたときに、それが作成するデーモンスレッドからのものであるようです。それを解決していない場合は、私の観測しきい値を下回る頻度を減らした解決策は、マルチ処理が完了したときにpool.terminate()または同様のものを呼び出すことです。
追加された 著者 boboquack,

2 答え

That is bug http://bugs.python.org/issue14623

最も単純な回避策は、タイムアウトを追加することです

time.sleep(1)

スクリプトが終了して終了する前にスレッドが終了するようにするスクリプトの最後に

3
追加された
または、より良いことに、開始されたすべてのスレッドを追跡し、それらが正しく終了してクリーンアップされていることを確認するために t.join()を呼び出します。
追加された 著者 John Szakmeister,

あなたのサンプルスクリプトは大丈夫だと思われます。つまり、python 2.7.2を使って私にとってうまく動作します。

What version of python are you using? It's possible the errors you're seeing may be related to this bug. If so, then upgrading to python>=2.6.5 or python>=3.1 might help.

1
追加された
私はPython 2.7と同様の問題を抱えています:スレッドの例外Thre​​ad-9429:Traceback(最近の最後の呼び出し):ファイル "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py" 、行552、self.run()ファイル "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py"、行756、run self.function(* self。 args、** self.kwargs)TypeError: 'NoneType'オブジェクトは呼び出し可能ではありません
追加された 著者 jtlz2,
PYthon 2.7.5同じエラー
追加された 著者 Dmitry Dubovitsky,
奇妙な、しかしPython2.7でも同じエラー。
追加された 著者 glebus,