如何为aiohttp v3设置一个特定的循环?

时间:2018-03-03 13:27:24

标签: python python-3.6 python-asyncio aiohttp

我在loop中调用aiohttp方法时为aiohttp.web.run_app(loop)设置了v2.3。但是,更新到v3后,参数已消失,我找不到设置特定循环的方法。 (可能只有make_handler(loop),但我想要更高级别的API。)

虽然loop处有aiohttp.web.Application参数,但在aiohttp.web.Application的说明中,它是在loop参数上说的,如下所示。

  

循环 -

     

事件循环

     

自2.0版以来不推荐使用:不推荐使用该参数。循环在冻结阶段设置。

这里的freeze state是什么?

在浏览源代码时,似乎只是使用默认loop,在内部调用asyncio.get_event_loop()

loop设置特定的aiohttp是否有任何不同的方式?

修改

这是我的用例。

  1. 在我的应用中,它内部调用loop.create_task
  2. 在v2.3中,我向应用提供了具体的loop并使用了loop,以便所有包含aiohttp的协同程序都在loop上运行。
  3. 在第3版中,我可以通过使所有协同程序使用默认loop来实现,以便包含aiohttp的所有协同程序都运行在默认loop上。
  4. 但是,当我使用unittest运行AioHTTPTestCase时,它会在内部禁用默认loop并使用新循环(new_event_loop)。
  5. 结果,其他协程会生成错误,因为他们尝试在loop中使用默认unittest
  6. 我想如果没有办法我需要对我的应用程序进行一些更改。但是,在此之前,我只想确定它以及aiohttp组删除它的原因。

1 个答案:

答案 0 :(得分:0)

自从将最小支持版本削减到Python 3.5.3后,可以通过将测试循环设置为asyncio.set_event_loop()的默认值来修改测试套件。

奇怪的是你怎么没有初始化事件循环呢? 所有初始化挂钩(self.get_application()self.get_server()self.get_client())都在协程上下文中调用,一切都应该完美。

我看到了唯一的方法 - 你可能在Python 3.5.1或3.5.2上安装了aiohttp 3并使用旧的setuptools版本忽略了python_requires参数。