Py学习  »  Python

如何在现有框架中使用asyncio?

RobberPhex • 11 年前 • 3896 次点击  

Python 3.4开始集成asyncio模块,但是我觉得它很难集成在现有框架中。

以Django为例,gevent可以直接给底层打patch来实现coroutine的功能。

反观asyncio,假设我在请求响应中调用同步IO函数,即使有一个库将这个同步函数替换成异步的,此时该coroutine需要让出CPU控制权,但是asyncio中只有yield from和return才能让出CPU控制权:

  • 如果通过yield from让出控制权,则会丧失向后兼容性;比如我写了yield from,PY2.X不认。还有,一般开发时采用同步IO函数,部署时替换为异步IO,同样需要兼容。
  • 至于通过return让出CPU控制权,那就只能等到该请求处理完了;也就是说,在请求处理过程中,即使该coroutine在处理IO,也不能把控制权让给别的coroutine。(在单线程、单进程,多coroutine的情况下)

另外,请各位讨论下通过将异步请求包装为Future对象,然后交给单独线程处理的方法(run_in_executor方法)的可行性。

若有理解不对的地方,请指出,谢谢!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/652