Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除/销毁已完成的异步IO Python_Python_Asynchronous - Fatal编程技术网

删除/销毁已完成的异步IO Python

删除/销毁已完成的异步IO Python,python,asynchronous,Python,Asynchronous,我有一个Python脚本,它使用asyncio发出超过一百万个请求。我首先遇到内存问题,然后发现了信号量,此后我成功地实现了一个信号量,以限制并发任务以及队列中任务的数量 我的程序加载一个请求列表,如下所示: with open(wordlist) as words: w = words.read().splitlines() 然后,该列表被传递给下面的函数进行处理,实际工作就完成了 async def _process_dns_wordlist(sel

我有一个Python脚本,它使用asyncio发出超过一百万个请求。我首先遇到内存问题,然后发现了信号量,此后我成功地实现了一个信号量,以限制并发任务以及队列中任务的数量

我的程序加载一个请求列表,如下所示:

        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更有效(更可读),但具有相同的净效果