Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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
Python 显式关闭异步IO事件循环的必要性_Python_Python 3.x_Python Asyncio - Fatal编程技术网

Python 显式关闭异步IO事件循环的必要性

Python 显式关闭异步IO事件循环的必要性,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,故事: 我目前正在浏览,特别是最简单的HTTP客户端。主函数启动一个事件循环,运行到数据获取完成并关闭事件循环: def main(): loop = get_event_loop() try: body = loop.run_until_complete(fetch()) finally: loop.close() print(body.decode('latin-1'), end='') 但是,如果省略循环.close(),代

故事:

我目前正在浏览,特别是最简单的HTTP客户端。主函数启动一个事件循环,运行到数据获取完成并关闭事件循环:

def main():
    loop = get_event_loop()
    try:
        body = loop.run_until_complete(fetch())
    finally:
        loop.close()
    print(body.decode('latin-1'), end='')
但是,如果省略
循环.close()
,代码也可以工作:

问题:

虽然有一个例子,但问题是一个通用的问题——如果忘记关闭asyncio事件循环,可能会出现什么问题?事件循环是否总是隐式关闭?

.close()
可由不同的事件循环实现来释放循环分配的系统资源(或执行任何其他操作)。如果您查看
\u UnixSelectorEventLoop
的代码,这是Linux中使用的(默认)IOLoop,您会发现以下代码:

def close(self):
    super().close()
    for sig in list(self._signal_handlers):
        self.remove_signal_handler(sig)
例如,在这里,
close()
删除在
循环中注册的信号处理程序。添加信号处理程序()

由于可以在不同的线程上启动多个ioloop,或者在关闭旧的ioloop后可以创建新的ioloop(请参见
asyncio.new\u event\u loop()
),因此关闭它们应该被视为一个好习惯

更新

从Python 3.7开始,建议使用而不是
run\u,直到完成()


除其他事项外,
asyncio.run
负责
最后
close()
关闭循环

你会泄露资源。你认为什么会隐式关闭它?我认为垃圾收集只能在程序结束时使用,在事件循环结束后,程序运行多长时间直到程序结束?@FilipHaglund,谢谢。您能想出一种方法来测试/演示这一点吗?(请记住,对于python 3.3,is用于asyncio,对于python 3.5/3.6,is用于asyncio。)因为自python 3.7以来,建议您使用它来实现这一点:
def close(self):
    super().close()
    for sig in list(self._signal_handlers):
        self.remove_signal_handler(sig)
# Python 3.7+
def main():
    body = asyncio.run(fetch())
    print(body.decode('latin-1'), end='')