urllib2中的重复主机查找失败
我有一段代码,用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()
,这会导致套接字泄漏。