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方法)的可行性。
若有理解不对的地方,请指出,谢谢!