2010-12-29 14 views
0

Pythonのurllib2を使用して、いくつかのスレッドで多数のHTTP GET要求を発行し、ファイルに応答を書き込むコードがスレッドごとに1つあります。
実行中、多くのホスト検索が失敗したように見えます(名前またはサービスの不明なエラーが発生しました。例のエラーログを参照)。urllib2で繰り返されるホストルックアップ

これはフレークなDNSサービスによるものですか?ホスト名が変更されていない場合、DNSキャッシングに頼るのは悪い習慣ですか?私。 1回の検索結果を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> 

UPDATE私の(非常に単純な)コード

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! 

セマフォは、実行中のスレッドの合計数を制約するBoundedSemaphoreあります。

+0

誰かが尋ねる前に、はい、要求のいくつかは成功します。プログラムの構造は次のとおりです。各baseUrlの1つのスレッドで、各ファイルに対してopen baseUrl/fileを開き、スレッドのファイルにデータを追加します。 「ファイル」は実際には動的に生成され、そのようなファイルがなければ404を返すのではなく空になります。 –

答えて

3

これはPythonの問題ではないため、Linuxシステムではnscd (Name Service Cache Daemon)が実際に実行されていることを確認します。

UPDATE: そして、あなたがpage.close()ので、漏れてソケットを呼び出すことはありませんあなたのコードを見ています。

+0

nscdは__not__を実行していましたが、問題はわずかしか改善されていないようです。エラーが到着するまで(そして多くの場合)、遅延が長くなります。 –

+0

ソケットなどが漏れていないと確信していますか? – ismail

+0

'f.write(page.read())'の後に 'page.close()'を呼び出す – ismail

関連する問題