python - 在 Python3 的 Tornado 上使用非阻塞 MySQL api 有什么建议吗?

标签 python database asynchronous io tornado

在阅读源代码后,我希望 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/

相关文章:

python - 从数据框列值末尾删除字符

python - 这个 selenium firefox 配置文件将文件下载到自定义文件夹有什么问题?

javascript - 我可以在 Angular 的 Promise 链中调用函数吗

.net - 在 C# .NET 中,异步操作是否一定会创建一个阻塞线程?

database - 媒体播放器:从数据库流

Javascript Rest API 在 for 循环中获取调用而不为元素设置值

python - 从从文本文件中提取 IP 的正则表达式中排除 IP

python - 适合初学者的 Python 类(class)

c# - 登录 ASP.NET 网站时出现 fatal error 9001

sql - 如何获取不包含在分组依据中的列的值(SQL Server)