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?
risposta
È 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.
Eccellente! Grazie. Ci sono avvertenze che dovrei essere a conoscenza (che non compaiono nei documenti) quando lo si utilizza in questo modo? – Matty
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
@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
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ò.
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
@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
@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
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.
- 1. Può ClickOnce essere configurato per eliminare le vecchie directory pubblicate?
- 2. Sass e numeri di arrotondamento. Può essere configurato?
- 3. phantomjs non può essere avviato
- 4. Un riferimento non può essere NULL o può essere NULL?
- 5. Un socket può essere reso non bloccante solo per la funzione recv()?
- 6. Può essere configurato per non stampare un percorso completo nei messaggi di avviso/errore?
- 7. Automapper.Mapper.CreateMap non può essere risolto
- 8. @JavascriptInterface non può essere risolto
- 9. org.json.simple non può essere risolto
- 10. directory virtuale non essere configurato come un'applicazione in IIS
- 11. simbolo non può essere risolto
- 12. record non può essere trovato
- 13. "ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass" non può essere incorporato
- 14. Il sito Web non può essere configurato correttamente; ottenere informazioni sul processo ASP.NET non riuscite. Richiesta
- 15. R.id non può essere risolto
- 16. setLatestEventInfo non può essere risolto
- 17. int non può essere dereferenziato
- 18. Operatore && non può essere applicato
- 19. ReflectionException non può essere catturato?
- 20. SpringUtilities non può essere risolto
- 21. Double non può essere dereferenziato?
- 22. android.annotation non può essere risolto
- 23. Come deve essere configurato un ambiente QA?
- 24. Eclipse può essere configurato per disabilitare gli avvisi per i file di origine derivati?
- 25. Può essere configurato per disabilitare le unioni per determinati tipi di file?
- 26. Proxy non può essere lanciato alla classe
- 27. Swift: Enum 'non può essere costruito perché non ha inizializzatori accessibili' non può essere costruita
- 28. Xcode 7.1: il simulatore non può essere aperto perché l'identità dello sviluppatore non può essere confermata
- 29. Può user.name essere contraffatti
- 30. Javascript può essere riavviato?
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
@AdamKG Probabilmente questa dovrebbe essere una risposta, non un commento! :-) – Matty