即使使用了类似tornado这样的非阻塞io web服务器,能让我们的web性能提供很多,但是在实际应用中与测试的效果相差很远,应该是说我们的测试考虑非常不全面。
现在的web应用几乎不可能少了数据库访问操作,而数据库访问操作却是阻塞的, 如MySQLdb,显然,类似tornado,stackless这些协程方式编写的web,性能会受到大大的制约。
解决方案:让数据库操作变成非阻塞的
它又是如何实现的呢?即使eventlet实现了非阻塞的socket(因为MySQLdb没有使用到),显然MySQLdb的C代码实现肯定是阻塞的。客观条件下无法变成非阻塞的,只有改变一下思路,使用线程来达到非阻塞不就可以了?eventlet不仅有线程实现版本,还有一个进程的实现版本(SaranwrappedConnectionPool),有兴趣的pythonic可以看看db_pool的源代码 (http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/db_pool.py),YD一番吧。
^_^.