python - 多线程。线程异常

标签 python multithreading exception

我试图用 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

最佳答案

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

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

time.sleep(1)

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

关于python - 多线程。线程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7916749/

相关文章:

python - Pymongo 聚合不返回游标而是返回对象

Python 在 f.write 中使用变量

python - 将字符串附加到列表

Java 8 并行流或方法执行

multithreading - 锁定集合的通常最佳方法是什么?

c# - nunit resharper 预期异常测试

python - 如何使用我的自定义异常流程类重写异常消息?

python - Django 有办法打开 HTTP 长轮询连接吗?

c# - 如何检测应用程序何时终止?

C#:分析 "unsafe"方法调用