python线程 - 一个问题

时间:2011-09-06 11:42:03

标签: python multithreading urllib

我无法弄清楚此代码中的问题。

class Threader(threading.Thread):
    def __init__(self, queue, url, host):
        threading.Thread.__init__(self)
        self.queue = queue
        self.url = url
        self.host = host

    def run(self):

        print self.url # http://www.stackoverflow.com            

        with contextlib.closing(urllib2.urlopen(self.url)) as u:
            source = u.read()

        print "hey" # this is not printing!

        source = self.con()

        doc = Document(source)

        self.queue.put((doc, self.host))         

运行此代码时,print self.url成功输出了网址,但print "hey"无效。所以基本上,(我相信)contextlib会阻塞代码。我还尝试了不使用urlopen的传统contextlib方法,但它也不起作用。此外,我尝试try - except但该程序不会引发任何错误。那么这可能是什么问题呢?

2 个答案:

答案 0 :(得分:2)

您的代码不起作用,我已经冒昧地调整它(导入,也不知道Document和self.con),并使其与python2兼容(这就是我在这里使用的当下) - 它有效:

from __future__ import with_statement
import threading, Queue, urllib2, contextlib

class Threader(threading.Thread):

    def __init__(self, queue, url, host):
        threading.Thread.__init__(self)
        self.queue = queue
        self.url = url
        self.host = host

    def run(self):
        print self.url
        with contextlib.closing(urllib2.urlopen(self.url)) as u:
            source = u.read()
        print "hey"

if '__main__'==__name__:
    t = Threader(Queue.Queue(), 'http://www.stackoverflow.com', '???')
    t.start()
    t.join()

编辑:也适用于“with”和contextlib

答案 1 :(得分:0)

由于仅使用urllib问题仍然存在,最可能的原因是您尝试打开的网址没有响应。

你应该尝试

  1. 在浏览器或简单的Web客户端(如Linux上的wget)中打开网址
  2. 设置timeout
  3. urllib2.urlopen参数