删除/销毁已完成的异步IO Python
我有一个Python脚本,它使用asyncio发出超过一百万个请求。我首先遇到内存问题,然后发现了信号量,此后我成功地实现了一个信号量,以限制并发任务以及队列中任务的数量 我的程序加载一个请求列表,如下所示:删除/销毁已完成的异步IO Python,python,asynchronous,Python,Asynchronous,我有一个Python脚本,它使用asyncio发出超过一百万个请求。我首先遇到内存问题,然后发现了信号量,此后我成功地实现了一个信号量,以限制并发任务以及队列中任务的数量 我的程序加载一个请求列表,如下所示: with open(wordlist) as words: w = words.read().splitlines() 然后,该列表被传递给下面的函数进行处理,实际工作就完成了 async def _process_dns_wordlist(sel
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文档,但没有看到销毁/删除方法。我是不是错过了一些很明显的东西
谢谢你的帮助 答案很简单,但我不确定这是否是正确的方法 在我的回调中,在处理完结果后,我执行了以下操作:
self.tasks.remove(future)
这成功地解决了我的记忆问题。如果你有更好的方法来处理这个问题,请让我知道 您是否出于某种原因需要存储任务?据我所知,每个任务对象都由eventloop保存。当您在self.tasks中存储另一个副本时,在eventloop完成该副本时,仍会有对它的引用(在self.tasks中)。这将防止将来(已经完成)被垃圾收集 如果您将
self.tasks
更改为本地tasks
变量以传递到聚集,然后超出范围,我想代码也会工作得很好,占用的内存更少
这将比在回调中删除future更有效(更可读),但具有相同的净效果