2012-04-18 134 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。