Multi-threading. Uitzondering in thread

Ik probeer dit te begrijpen met een voorbeeld . Hier is de code:

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)

Soms krijg ik deze foutmelding hier:

Uitzondering in thread Thread-10 (waarschijnlijk verhoogd tijdens uitschakeling tolk)

Leg uit wat de oorzaak is.

Update door een andere auteur:

Hier is de volledige uitzondering die ik zie in vergelijkbare code:

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
Enkele ideeën over hoe mensen misschien meer bereid zijn om u te helpen: 1. Leg uit wat u hebt gedaan om het probleem te diagnosticeren en waarom uw inspanningen faalden. 2. Probeer de code te beperken tot het minimum dat nodig is om de fout te voorkomen. 3. Geef de volledige traceback van de fout.
toegevoegd de auteur Sven Marnach, de bron
Ik zie dezelfde fout in dezelfde code. Ik voeg hierboven mijn volledige uitzondering toe.
toegevoegd de auteur Ry4an Brase, de bron
Ik vind deze fout af en toe wanneer ik de multiprocessing.Pool-klasse gebruik. Het lijkt afkomstig te zijn van de daemon-threads die het creëert en dat nog steeds operationeel is wanneer de interpreter dingen begint te verwijderen tijdens het afsluiten. Een oplossing die, als deze niet is opgelost, de frequentie onder mijn waarnemingsdrempel heeft verlaagd, door een aanroep te doen naar pool.terminate() of iets dergelijks wanneer u klaar bent met de multiverwerking.
toegevoegd de auteur boboquack, de bron

2 antwoord

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

De eenvoudigste oplossing is om time-out toe te voegen

time.sleep(1)

aan het einde van het script waarmee de threads kunnen eindigen voordat het script het einde van het leven bereikt en wordt afgesloten

3
toegevoegd
Of beter nog, houd alle gestarte threads bij en bel t.join() om ervoor te zorgen dat ze correct zijn afgesloten en worden opgeschoond.
toegevoegd de auteur John Szakmeister, de bron

Uw voorbeeldscript lijkt in orde - wat betekent dat het prima werkt voor mij met behulp van 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
toegevoegd
Ik krijg een soortgelijk probleem met python 2.7: Uitzondering in thread Thread-9429: Traceback (meest recente oproep laatste): Bestand "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py" , regel 552, in __bootstrap_inner self.run() Bestand "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py", regel 756, in run self.function (* self. args, ** self.kwargs) TypeError: 'NoneType'-object kan niet worden gecalld
toegevoegd de auteur jtlz2, de bron
PYthon 2.7.5 dezelfde fout
toegevoegd de auteur Dmitry Dubovitsky, de bron
Vreemd, maar zelfs bij python2.7 dezelfde fout.
toegevoegd de auteur glebus, de bron