urllib2中的重复主机查找失败

0 投票
1 回答
1563 浏览
提问于 2025-04-16 09:10

我有一段代码,用Python的urllib2库发起了很多HTTP GET请求,这些请求是通过多个线程同时进行的,响应结果会写入文件(每个线程一个文件)。
在执行过程中,很多主机的查找似乎都失败了(导致出现了“未知的名称或服务”错误,具体的错误日志可以查看附加的内容)。

这是不是因为DNS服务不稳定呢?如果主机名没有变化,依赖DNS缓存算不算不好的做法?也就是说,单次查找的结果应该传递给urlopen吗?

Exception in thread Thread-16:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/home/da/local/bin/ThreadedDownloader.py", line 61, in run
     page = urllib2.urlopen(url) # get the page
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1170, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1145, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno -2] Name or service not known>

更新 我的(非常简单的)代码

class AsyncGet(threading.Thread):

def __init__(self,outDir,baseUrl,item,method,numPages,numRows,semaphore):
    threading.Thread.__init__(self)
    self.outDir = outDir
    self.baseUrl = baseUrl
    self.method = method
    self.numPages = numPages
    self.numRows = numRows
    self.item = item
    self.semaphore = semaphore

def run(self):
    with self.semaphore: # 'with' is awesome.
        with open( os.path.join(self.outDir,self.item+".xml"), 'a' ) as f:
            for i in xrange(1,self.numPages+1):
                url = self.baseUrl + \
                "method=" + self.method + \
                "&item=" + self.item + \
                "&page=" + str(i) + \
                "&rows=" + str(self.numRows) + \
                "&prettyXML"
                page = urllib2.urlopen(url)
                f.write(page.read())
                page.close() # Must remember to close!

信号量是一个有界信号量,用来限制同时运行的线程总数。

1 个回答

3

这不是一个Python的问题。在Linux系统上,确保 nscd (名称服务缓存守护进程) 实际上是正在运行的。

更新: 从你的代码来看,你从来没有调用过 page.close(),这会导致套接字泄漏。

撰写回答