@
serial twisted, tornado, asyncio, eventlet, gevent 这些主要就只有两种设计风格,各自风格内部是可以兼容的。比如 twisted 与 tornado 官方有为彼此兼容推出模块(
http://www.tornadoweb.org/en/stable/twisted.html), eventlet 与 gevent 都是基于 greenlet ,甚至连 API 都是基本雷同。
monkey patch 是 eventlet 与 gevent 背后的惯用手法(当然你也可以不用 monkey patch, 而是对应得采用他们所提供的 io 库的非阻塞版本,标准库中的所有 io 模块对应的都有实现,包括 os, socket, queue 等等。) monkey patch 手法的手坏,我觉得仁者见仁智者见智,对我个人来说他似乎看起来是有些 evil ,但也确实在实际的使用场景中大有用武之地。
对于 asyncio 来说,与之搭配的异步 io 库基本都在这里:
http://asyncio.org/。以上几个框架,背后的 io 多路复用技术都是基于 select, poll, epool , kqueue ,实现了自己的 hub 或者叫 ioloop 。
纵上, twisted/tornado/asyncio 的 generator style 异步与 eventlet/gevent 的协程异步都可以完成自己的任务。相应的,各自阵营也都有自己完备的异步 io 解决方案,我看这里没有你所诟病的问题。至少, 基于 python 的技术栈是能够解决异步与阻塞的问题的,也是能够实现高并发的。
当然,要想在上述几个阵营之间切换就不现实了,还有 python2 -> python3 之间的升级也是问题。这是事实。
此外, 对于你所提到的几个事实,我有以下疑问:
说 openstack 自己实现了所有的异步驱动,这是啥意思, openstack 中的异步都是基于 eventlet 的 monkey_patch ,将标准库中的所有 io 行为替换为异步版本,据我所知这里不需要自行实现任何的所谓“异步驱动”。
“放弃高并发使用 django, flask ”这个说得也是奇怪, django 只是使用 python 来制作 wsgi 程序,而 wsgi 程序可以交给 apache/nginx 等来调用,此时的高不高并发,完全是由 apache/nginx 来支持的,跟 django 有什么关系。
另外 @
GeekGao 说的 “ io 阻塞不阻塞跟语言没有关系”, 我不知道你是怎么理解的,使用 python 这种语言是即可以写出阻塞式的 io 程序,也可以写出非阻塞式的 io 程序,这只取决于你在调用系统调用的时候,是否指定了相应的参数而已。诚然 python 标准库中默认都是使用阻塞式的 io ,也许你诟病的就是这个?
最后,明确一下我个人的看法, python 完全是可以使用异步与高并发的, io 不是其短板, cpu 确实是(cpython)。时至今日, openstack, douban, zhihu 这些巨大软件体都基于 python 来实现的时候,我认为像 “ python 是胶水语言,是像 shell 一样的脚本语言”这样的论断,是不攻自破的。然而,这并不是我说我很喜欢 python ,与 go 语言的异步相比, 我也认为 python 真的有够折腾,有够 ugly ,而且其 GIL 导致它只能使用 ”进程 + 协程“ 的组合,而不能使用 "线程 + 协程“ 的组合,等等。 python 确实让我感觉不爽,不过没有在座某些人说的那么不堪。