2012-04-18 128 views
24

我的印象是通过SQLAlchemy调用数据库会阻塞并且不适合用于除同步代码以外的任何其他应用程序。我是否正确(我希望我不是!)还是有办法将其配置为非阻塞?SQLAlchemy可以配置为非阻塞吗?

+1

简答题,没有。它是阻塞的数据库库,而不是SQLalchemy本身。尽管如此,没有什么能阻止你在单独的线程中完成数据库的工作 – AdamKG 2012-04-18 16:51:53

+2

@AdamKG这可能应该是一个答案,而不是评论! :-) – Matty 2012-04-18 16:54:23

回答

24

您可以使用gevent以非阻塞样式使用SQLA。下面是一个例子使用psycopg2,使用psycopg2的coroutine support

https://bitbucket.org/zzzeek/green_sqla/

我还听说人们使用与pymysql同样的想法。由于pymysql采用纯Python并使用套接字库,因此gevent将套接字库修补为异步。

+0

优秀!谢谢。当我以这种方式使用它时,是否有任何需要注意的警告(没有出现在文档中)? – Matty 2012-04-18 19:04:24

+1

不确定。我发现它似乎更好地使用NullPool,它禁用池。否则有东西让它挂起。因此,可能要谨慎开始...... – zzzeek 2012-04-18 19:30:06

+3

@zzzeek您的挂起可能来自SQLAlchemy的默认池(QueuePool),使用非猴子修补的线程。您可以通过https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ申请gevent的猴子补丁程序,或者按照示例制作绿色版本的QueuePool。当我拥有它时,它确定了相同的行为。 – CryingCyclops 2012-07-03 21:50:37

6

看看Tornado,因为他们有一些整洁的非阻塞库,特别是tornado.gen。

我们将其与Momoko一起用于Tornado的非阻塞psycopg包装库。到目前为止,这是非常棒的。也许唯一的缺点是你失去了SQLAlchemy给你的所有模型对象。虽然性能是不真实的。

+0

我一直在寻找龙卷风,我很可能走下那条路。也许我应该编写一些演示代码来测试这一点,但如果psycopg驱动程序支持异步数据库调用(显然它支持),我想可以使用SQLAlchemy进行非阻塞的数据库调用。 – Matty 2012-04-18 17:31:50

+0

@Matty好主意,我很想听听你如何去用它。我想你会用SQLAlchemy命中的主要问题之一是不知道什么时候会发生阻塞呼叫。当然,你总是可以深入研究代码,弄清楚什么时候我的直觉说这将会是很多工作。 – kuhnza 2012-04-18 17:43:01

+0

@Kahunza在快速查看psycopg2的文档后,看起来有一个参数可以包含在传递给SQLAlchemy的'create_engine()'函数的连接字符串中。也许其中一位维护人员会加入进来,否则我会问他们的名单。干杯! – Matty 2012-04-18 17:52:35

1

没有greenlet的帮助,答案是否定的,在asyncio的上下文中。

但是,在asyncio中只能使用SQLAlchemy的一部分。请在GINO project中找到示例,其中我们仅使用没有引擎的SQLAlchemy核心和完整的执行上下文来在asyncio中创建一个简单的ORM。