在阅读源代码后,我希望 tornado 支持异步 sql 数据库操作,
http://www.tornadoweb.org/documentation/_modules/tornado/database.html#Connection
唉,他们正在阻止版本。这里有一些选择。
计划A:找到一组类似于mysqldb模块的api,除了他们使用回调来返回reuslt。抱歉,我没有找到一个显示他们的api可以处理非阻塞mysql操作的例子
方案B:使用block版本。我听tornado的作者建议开发者使用block版本,并且极度优化你的sql查询以缩短阻塞时间。
在我的例子中:服务器需要处理在高峰时段每秒接收 2k 请求,其中大部分需要从数据库查询和更新,建议每个操作需要 10ms,10ms*2k 超过 20s,那将是一场噩梦。多线程编程至少我可以建立更多的连接以获得更长的平均响应时间。
也许我在这里忽略了一些要点,我没有太多后端开发经验。但是我仍然认为在框架是非阻塞的情况下使用阻塞 io api 是一个糟糕的想法。
方案C:放弃MySql,使用mongoDB,听说mongoDB有一个异步的Python实现api叫asyncmongo,但我不确定学习mongoDB并把mongoDB作为我们业务选择的风险
最佳答案
另一种选择是设置多处理(http://docs.python.org/library/multiprocessing.html?highlight=multiprocessing#multiprocessing)并将其中一个进程用作数据库的队列管理器。
将多处理与高效的 SQL 查询相结合,您应该将整体影响降到最低。阻塞调用只会在 DB Processing Queue Manager 进程上完成,应用程序的其余部分可以运行而不会被阻塞。唯一受影响的人是那些试图同时运行数据库查询的人。
关于python - 在 Python3 的 Tornado 上使用非阻塞 MySQL api 有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12234998/