2017-06-17 3 views
1

私は100万以上のリクエストを作成するためにasyncioを使用するPythonスクリプトを持っています。私は最初にメモリの問題に遭遇し、次にセマフォを発見しました。それ以来、並行タスクの数とキュー内のタスクを一度に制限するためにセマフォを成功裏に実装しました。完成した未来を削除/破棄するasyncio Python

 with open(wordlist) as words: 
      w = words.read().splitlines() 

そして、そのリストが処理のために次の関数に渡されると、実際の作業が行われます:

私のプログラムは、このような要求のリストをロードします。

async def _process_dns_wordlist(self, wordlist, domain): 
    """Takes a list of words and adds them to the task list as space is available""" 
    for word in wordlist: 
     # Wait on the semaphore before adding more tasks 
     await self.sem.acquire() 
     host = '{}.{}'.format(word, domain) 
     task = asyncio.ensure_future(self._dns_lookup(host)) 
     task.add_done_callback(functools.partial(self._dns_result_callback, host)) 
     self.tasks.append(task) 
    await asyncio.gather(*self.tasks, return_exceptions=True) 

私は今、それがしばらく実行され、それがメモリ不足の約1/2方法を実行するため、クラッシュ、私はすべてのタスクをキューイングされたときにメモリが不足して、プログラムだけでクラッシュするセマフォを実装する前に、要求を通して。

将来はコールバックによって処理された後、メモリを浪費しているスペースに座っているためです。私の問題は、いったん処理が完了したら、処理された未来を削除するために何を使うべきかを知ることができないということです。私はasyncioのドキュメントを読んできましたが、破壊/削除メソッドは表示されません。本当に明白な何かが欠けていますか?

ありがとうございました!

答えて

1

答えはかなりシンプルでしたが、これが正しい方法かどうかはわかりません。私のコールバックで

、私は結果を処理して行われた後、私はこれをしなかった:

self.tasks.remove(future) 

これが成功した私の記憶の問題を解決しました。これに対処するより良い方法があれば教えてください!

関連する問題