【问题标题】:Multi-threading. Exception in thread多线程。线程异常
【发布时间】:2011-12-16 12:50:28
【问题描述】:

我试图通过example 来理解。代码如下:

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)

有时我会在这里收到此错误:

线程 Thread-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
<type 'exceptions.TypeError'>: 'NoneType' object is not callable

【问题讨论】:

  • 人们可能更愿意帮助您的一些想法: 1. 解释您为诊断问题所做的工作以及您的努力失败的原因。 2. 尝试将代码减少到发生错误所需的最低限度。 3.给出错误的完整回溯。
  • 我在类似的代码中看到了同样的错误。我将在上面添加我的完整例外。
  • 我在使用 multiprocessing.Pool 类时偶尔会发现此错误。当解释器在关闭期间开始删除内容时,它似乎来自它创建的守护程序线程仍在运行。一个解决方案,如果它没有解决它,它将频率降低到我的观察阈值以下,当你完成多处理时,调用 pool.terminate() 或类似的方法。

标签: python multithreading exception


【解决方案1】:

那是错误http://bugs.python.org/issue14623

最简单的解决方法是添加超时

time.sleep(1)

在脚本结束时允许线程在脚本生命周期结束并关闭之前完成

【讨论】:

  • 或者更好的是,跟踪所有启动的线程并在它们上调用t.join() 以确保它们已正确退出并被清理。
【解决方案2】:

您的示例脚本似乎没问题 - 也就是说,它在我使用 python 2.7.2 时运行良好。

你用的是什么版本的python?您看到的错误可能与this bug 有关。如果是这样,那么升级到 python>=2.6.5 或 python>=3.1 可能会有所帮助。

【讨论】:

  • 我遇到了与 python 2.7 类似的问题:线程 Thread-9429 中的异常:回溯(最后一次调用):文件“/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2 .7/threading.py”,第 552 行,在 __bootstrap_inner self.run() 文件“/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/threading.py”,第 756 行,运行自我.function(*self.args, **self.kwargs) TypeError: 'NoneType' object is not callable
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2014-03-23
  • 2012-02-17
  • 2010-10-11
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多