我的印象是通过SQLAlchemy调用数据库会阻塞并且不适合用于除同步代码以外的任何其他应用程序。我是否正确(我希望我不是!)还是有办法将其配置为非阻塞?SQLAlchemy可以配置为非阻塞吗?
回答
您可以使用gevent以非阻塞样式使用SQLA。下面是一个例子使用psycopg2,使用psycopg2的coroutine support:
https://bitbucket.org/zzzeek/green_sqla/
我还听说人们使用与pymysql同样的想法。由于pymysql采用纯Python并使用套接字库,因此gevent将套接字库修补为异步。
优秀!谢谢。当我以这种方式使用它时,是否有任何需要注意的警告(没有出现在文档中)? – Matty 2012-04-18 19:04:24
不确定。我发现它似乎更好地使用NullPool,它禁用池。否则有东西让它挂起。因此,可能要谨慎开始...... – zzzeek 2012-04-18 19:30:06
@zzzeek您的挂起可能来自SQLAlchemy的默认池(QueuePool),使用非猴子修补的线程。您可以通过https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ申请gevent的猴子补丁程序,或者按照示例制作绿色版本的QueuePool。当我拥有它时,它确定了相同的行为。 – CryingCyclops 2012-07-03 21:50:37
看看Tornado,因为他们有一些整洁的非阻塞库,特别是tornado.gen。
我们将其与Momoko一起用于Tornado的非阻塞psycopg包装库。到目前为止,这是非常棒的。也许唯一的缺点是你失去了SQLAlchemy给你的所有模型对象。虽然性能是不真实的。
我一直在寻找龙卷风,我很可能走下那条路。也许我应该编写一些演示代码来测试这一点,但如果psycopg驱动程序支持异步数据库调用(显然它支持),我想可以使用SQLAlchemy进行非阻塞的数据库调用。 – Matty 2012-04-18 17:31:50
@Matty好主意,我很想听听你如何去用它。我想你会用SQLAlchemy命中的主要问题之一是不知道什么时候会发生阻塞呼叫。当然,你总是可以深入研究代码,弄清楚什么时候我的直觉说这将会是很多工作。 – kuhnza 2012-04-18 17:43:01
@Kahunza在快速查看psycopg2的文档后,看起来有一个参数可以包含在传递给SQLAlchemy的'create_engine()'函数的连接字符串中。也许其中一位维护人员会加入进来,否则我会问他们的名单。干杯! – Matty 2012-04-18 17:52:35
没有greenlet的帮助,答案是否定的,在asyncio的上下文中。
但是,在asyncio中只能使用SQLAlchemy的一部分。请在GINO project中找到示例,其中我们仅使用没有引擎的SQLAlchemy核心和完整的执行上下文来在asyncio中创建一个简单的ORM。
- 1. mpi:阻塞与非阻塞
- 2. AsyncHttpClient可以执行非阻塞异步HTTP调用吗?
- 3. 使用node.js可以做非阻塞的Facebook API调用吗?
- 4. 我可以防止MongoDB :: command()阻塞吗?
- 5. 为什么concurrent_queue非阻塞?
- 6. 非阻塞stdio
- 7. 非阻塞pthread_join
- 8. 非阻塞spmd
- 9. 带延迟的阻塞/非阻塞
- 10. 嵌套Socket阻塞非阻塞SocketHi
- 11. 非阻塞PASV袜子和阻塞
- 12. 是renderer.render()阻塞还是非阻塞?
- 13. 非阻塞写入和阻塞recv
- 14. 非阻塞PostgreSQL ORM
- 15. 非阻塞等待
- 16. 非阻塞的PipedStreams?
- 17. 非阻塞的getch()
- 18. java.io.BufferedReader.readLine()是非阻塞
- 19. 非阻塞getch(),ncurses
- 20. 非阻塞选择()?
- 21. 非阻塞队列
- 22. WPF:非阻塞UI
- 23. 网络阻塞到非阻塞,只有线程作为选项?
- 24. 为什么select()始终在非阻塞模式下被阻塞
- 25. 将线程阻塞转换为f中的非线程阻塞#
- 26. available and read:在使用阻塞Java I/O时,我们实际上可以是非阻塞吗?
- 27. 我们可以用阻塞套接字做一个非阻塞的服务器吗?
- 28. Java中的非阻塞CAS是否真的非阻塞?
- 29. IronPython + Winforms以非阻塞的方式
- 30. 如何将套接字重置为阻塞模式(将其设置为非阻塞模式后)?
简答题,没有。它是阻塞的数据库库,而不是SQLalchemy本身。尽管如此,没有什么能阻止你在单独的线程中完成数据库的工作 – AdamKG 2012-04-18 16:51:53
@AdamKG这可能应该是一个答案,而不是评论! :-) – Matty 2012-04-18 16:54:23