urllib2.urlopen不适用于单独的线程

时间:2011-12-05 13:51:16

标签: python

我正在开发一个应用程序来下载网页代码并捕获链接。 它可以工作,但如果我将程序连接到GUI,它会锁定相应的按钮,直到下载完成。

如果我通过一个单独的线程触发下载,为了避免按钮锁定,它只是冻结并且没有完成执行。

这是正常的吗?或者我错过了什么?

下面是代码片段。如果我从一个单独的线程调用grab(),没有任何反应,也没有错误。

函数update_observers()仅通知观察者,而不是其他人。 观察者负责进行任何更改,在这种情况下,重绘GUI。

def grab(self, url):        
        try:
            self._status = 'Downloading page.'
            self.update_observers()
            inpu = urllib2.urlopen(url)

        except URLError, e:
            self._status = 'Error: '+ e.reason
            self.update_observers()
            return None

        resp = []  
        self._status = 'Parsing links'
        self.update_observers()
        for line in inpu.readlines():
            for reg in self._regexes:
                links = reg.findall(line)
                for link in links:
                    resp.append(link)

        self._status = 'Ready.'
        self.update_observers()
        return resp

此代码在此处调用:

def grab(self, widget):
    t = Thread(target=self.work)
    t.setDaemon(True)
    t.start()

def work(self):
    print "Working"
    self.links = None
    self.links = self.grabber.grab(self.txtLink.get_text())
    for link in self.links:
        self.store.append([link])
    print "Ok."

如果我将代码从work()移到抓取,删除线程的东西,那就没关系了。

1 个答案:

答案 0 :(得分:0)

我在gtk.gdk.threads_init()之前调用了gtk.main(),一切都运行良好,没有任何变化。