Multi-Threading. İş parçacığında istisna

Bir örnek ile anlamaya çalışıyorum. İşte kod:

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)

Bazen bu hatayı burada alırım:

Thread-10 iş parçacığında özel durum (büyük olasılıkla yorumlayıcı kapatma sırasında kaldırıldı)

Lütfen buna neden olan şeyi açıkla.

Başka bir yazarın güncellemesi:

İşte benzer kodda gördüğüm tam istisna:

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
Bazı fikirler, insanların size nasıl yardım etmek konusunda daha istekli olabileceğini düşünebilir: 1. Sorunu teşhis etmek için neler yaptığınızı ve çabalarınızın neden başarısız olduğunu açıklayın. 2. Hatanın oluşması için gerekli olan minimum değeri azaltmaya çalışın. 3. Hatanın tam izini verin.
katma yazar Sven Marnach, kaynak
Aynı kodda aynı hatayı görüyorum. Yukarıdaki istisnamı ekleyeceğim.
katma yazar Ry4an Brase, kaynak
Ben multiprocessing.Pool sınıfını kullandığımda bu hatayı zaman zaman bulabilirsiniz. Tercüman, kapanma sırasında birşeyleri silmeye başladığında hala çalışmakta olduğu daemon iş parçacığı gibi görünüyor. Çözmediyse, gözlem eşiğimin altındaki frekansı azalttığı bir çözüm, çoklu işlemle işiniz bittiğinde pool.terminate() veya benzeri bir çağrı yapmaktır.
katma yazar boboquack, kaynak

2 cevap

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

En basit çözüm, zaman aşımı eklemektir

time.sleep(1)

komut dosyasının sonunda, iş parçacığı, senaryo sona ermeden ve kapanmaya başlamadan önce iş parçacığının bitmesini sağlar.

3
katma
Veya daha iyisi, başlatılan tüm konuları takip edin ve doğru şekilde çıkıp temizlendiğinden emin olmak için üzerlerinde t.join() 'i çağırın.
katma yazar John Szakmeister, kaynak

Örnek komut dosyanız iyi görünüyor - yani, python 2.7.2'yi kullanarak benim için iyi çalışıyor.

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
katma
Python 2.7 ile benzer bir sorun alıyorum: iş parçacığında özel durum Thread-9429: Traceback (son çağrı son): Dosya "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py" , satır 552, __bootstrap_inner'da self.run() Dosya "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python‌ 2.7/threading.py", satır 756, run self.function (* kendiliğinden. args, ** self.kwargs) TypeError: 'NoneType' nesnesi callable değil
katma yazar jtlz2, kaynak
PYthon 2.7.5 aynı hata
katma yazar Dmitry Dubovitsky, kaynak
Garip, ama python2.7 de aynı hata.
katma yazar glebus, kaynak