2015-12-19 30 views
1

正在使用asyncio構建應用程序。我將使用sqlalchemy作爲orm。 從我所瞭解的scoped_session將會話與一個線程關聯起來,這樣他們就不會對彼此的操作。 現在,因爲asyncio在單個線程上工作,我相信scoped_session將無法正常工作,這將導致問題。 用asyncio使用sqlalchemy會話的正確方法是什麼?sqlalchemy scoped_session正確使用python asyncio

回答

1

答案取決於你的代碼。

一般而言,您可以使用sessionmaker創建會話工廠並自行使用它。

如果您的代碼具有隱式上下文,則可以使用scoped_session和自定義scopefunc,如example中所示。

隱式上下文可能會利用asyncio.Task.current_task()調用,但您還需要找到範圍會話銷燬的方法。

+0

scoped_session破壞的默認行爲是什麼?當線程關閉時它會被銷燬嗎?在這種情況下,在任務完成時是否會破壞? – Shaumux

+0

'scoped_session'沒有析構函數,對不起。這就是爲什麼你需要上面例子中的信號訂閱。 –

+0

如果我使用aiohttp框架,我需要在scoped_session函數的scopefunc參數中提供什麼類型的信號訂閱? @AndrewSvetlov –

0

我不認爲你可以使用sqlalchemy與asyncio。 SQL Alchemy API全部阻塞,並且與asyncio不兼容。 http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/

可以gevent異步使用SQL鍊金術不過,只要你能找到爲您的數據庫GEVENT兼容的驅動程序。而gevent的多形體很好地映射到scoped_session

編輯:實際上,它看起來像你可以使用SQL鍊金術與ASYNCIO只要你能找到你的數據庫的ASYNCIO兼容的驅動程序,如https://github.com/aio-libs/aiopg。至於scoped_session,請使用current_task並在您的Web框架的請求端將其銷燬。

+0

我不想讓sqlalchemy異步。我想要做的是保持使用同一會話的任務不會同時發生,即任務不應共享會話。 – Shaumux