2012-04-01 4 views
2

これは2つの部分の質問です。まず、urllib2との接続をどのように適切に閉じるのですか?私はいくつかの例を見ており、私が見つけることができる最高のソリューションを採用しました。ただし、ファイルを閉じる際に問題が発生しているようです。どのように接続を閉じて、urllib2との接続を再利用しますか?

次のように現在、私は)(contextlibの終値を使用します。

try: 
     with closing(self.opener.open(self.address, 
             None, 
             self.timeout)) as page: 
      self.data = page.read() 
    except: 
     # bail out.. 

をしかし、私はまだOSX上で久しぶりに「あまりにも多くの開いているファイル」のエラーが表示されます。私はulimitを使用してファイルを2000以上に増やしました。カーネルの最大ファイル数を40,000以上に設定しました。私は、このメソッドが配置されているオブジェクトは処理されておらず、プログラムの存続期間中に残っていることに注意してください。しかし、私はオブジェクトに格納されている "データ"をアドレスとタイムアウトとともに保持しています。私は、ファイルのようなオブジェクトを保存しないでください。私は問題が参照される可能性があると思ったが、私はファイルのようなオブジェクトへの参照を直接格納せず、read()からのデータだけを格納することはないので、私はそう信じていない。これらのオブジェクトは、スレッドがQueueからURLを取得するたびに、再利用され、新しいデータで再ロードされます。

私は一度に約50の接続しか開きません。どのようにファイルが足りなくなるのかよく分かりません。私は、ファイルが不足した場合にも、netstatコマンドは、malloc関数のエラーでがらくたを開始:私はまた、接続をリセットし、シャットダウンせずにnetstatコマンドに正常に戻って取得する方法を見つけることができません

netstat(439) malloc: *** mmap(size=18446744073708605440) failed (error code=12) 
    *** error: can't allocate region 
    *** set a breakpoint in malloc_error_break to debug 
    netstat: malloc 18446744073708605396 bytes: Cannot allocate memory 

のnetstat -m

$ netstat -m 
475/3803 mbufs in use: 
    475 mbufs allocated to data 
    3328 mbufs allocated to caches 
407/3814 mbuf 2KB clusters in use 
0/577 mbuf 4KB clusters in use 
0/12 mbuf 16KB clusters in use 
11242 KB allocated to network (8.3% in use) 
0 requests for memory denied 
0 requests for memory delayed 
0 calls to drain routines 

接続する場合でも、私は、トラブルのエラーを見つけるを持っていますが、私は接続がタイムリーに閉鎖されていないと信じて、私は接続が再使用されていないだけでなく承知しています(私はそれを望む)単一のドメインに。それが問題の第二の部分です。誰かがurllib2との接続をどのように再利用できますか?

私は、キューからURLを取得するスレッドが複数あり、この種のルーチンを使用してデータを取得します。可能であれば、私は別のスレッドによって開かれている場合は、接続を再利用したいと思います。スレッド間で共有される唯一のデータはURLキューです。私は他のモジュールを見てきましたが、単なるURLよりも多くのデータを共有する必要があるようです。

答えて

4

私は、urllib2を削除し、素晴らしいRequestsライブラリを試してみることをお勧めします。

自動的に接続の再利用と接続を処理します。 (docs

また、非同期要求を作成するサポートもあります。 (docs

+0

私はこれをすばやく紹介し、urllib2オープナー機能をリクエストに置き換えることができるかどうかを確認します。私が心配しているのは、コードの残りの部分に及ぼす影響です。私は確かにそれをショットを与えるために喜んでいる!ありがとう –

+0

予備テストをしましたが、うまくいくようです。私はクローラーが死ぬかどうかを見る時間を与えるでしょう。私はまだ問題のより多くの考えに興味を持っていますので、解決するまで待つことにします。 –

関連する問題