2012-04-18 20 views
24

Ho l'impressione che le chiamate al database tramite SQLAlchemy si blocchino e non siano adatte per l'utilizzo in qualcosa di diverso dal codice sincrono. Sono corretto (spero di non esserlo!) O c'è un modo per configurarlo come non bloccante?SQLAlchemy può essere configurato per essere non bloccante?

+1

Risposta breve, no. Sono le librerie di database che stanno bloccando, non SQLalchemy stesso. Niente ti impedisce di fare cose DB in un thread separato, però. – AdamKG

+2

@AdamKG Probabilmente questa dovrebbe essere una risposta, non un commento! :-) – Matty

risposta

24

È possibile utilizzare SQLA in uno stile non bloccante utilizzando gevent. Ecco un esempio di utilizzo psycopg2, usando di coroutine support psycopg2: gente

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

Ho sentito anche utilizzare la stessa idea con pymysql. Poichè pymysql è in puro Python e usa la libreria socket, gevent patches la libreria socket per essere asincrona.

+0

Eccellente! Grazie. Ci sono avvertenze che dovrei essere a conoscenza (che non compaiono nei documenti) quando lo si utilizza in questo modo? – Matty

+1

non sono sicuro. ho trovato che funziona meglio usando NullPool, che disabilita il pooling. Altrimenti qualcosa lo stava facendo appendere. Quindi forse procedere con cautela per iniziare con .. – zzzeek

+3

@zzzeek I blocchi possono provenire dal pool predefinito di SQLAlchemy (QueuePool) utilizzando threading non-scimmia. Applicare la patch per scimmia di gevent o creare una versione verde di QueuePool come mostrato in https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ. Quello ha fissato lo stesso comportamento quando l'ho avuto. – CryingCyclops

6

Dai uno sguardo allo Tornado dato che hanno alcune librerie non bloccanti, in particolare tornado.gen.

Lo usiamo insieme a Momoko, una lib di wrapper psycopg non bloccante per Tornado. È stato grandioso finora. Forse l'unico inconveniente è che tu perdi tutte le cose sugli oggetti del modello che SQLAlchemy ti offre. La performance è irreale però.

+0

Ho visto Tornado e potrei andare su quella strada. Forse dovrei scrivere del codice demo per testarlo, ma se il driver psycopg supporta le chiamate al database asincrono (che a quanto pare lo fa), suppongo che sarebbe possibile effettuare chiamate DB non bloccanti con SQLAlchemy. – Matty

+0

@Matty Buona idea, mi piacerebbe sapere come ci vai. Uno dei problemi principali che immagino ti colpirà con SQLAlchemy non è sapere esattamente quando verrà effettuata una chiamata di blocco. Ovviamente si può sempre fare un tuffo nel codice per capire quando il mio istinto dice che ci sarà molto lavoro. – kuhnza

+0

@Kahunza Dopo aver dato una rapida occhiata ai documenti per psycopg2, appare un argomento che può essere incluso nella stringa di connessione passata alla funzione 'create_engine()' di SQLAlchemy. Forse uno dei manutentori interverrà o chiederò nella loro lista. Saluti! – Matty

1

Senza l'aiuto di Greenlet, la risposta è no, nel contesto di asyncio.

Tuttavia è possibile utilizzare solo una parte di SQLAlchemy in asyncio. Si prega di trovare l'esempio nello GINO project, dove abbiamo usato solo core SQLAlchemy senza motore e contesto di esecuzione completa per creare un semplice ORM in asyncio.

Problemi correlati