我的印象是通過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