Ich habe den Eindruck, dass Datenbankaufrufe über SQLAlchemy blockieren und nicht für andere Zwecke als synchronen Code geeignet sind. Habe ich Recht (ich hoffe ich bin es nicht!) Oder gibt es eine Möglichkeit, es als nicht blockierend zu konfigurieren?Kann SQLAlchemy als nicht blockierend konfiguriert werden?
Antwort
Sie können SQLA in einem nicht blockierenden Stil mit gevent verwenden. Hier ist ein Beispiel unter Verwendung von psycopg2, mit psycopg2 den coroutine support:
https://bitbucket.org/zzzeek/green_sqla/
ich auch habe gehört, Leute die gleiche Idee mit pymysql verwenden. Da pymysql in reinem Python ist und die Sockets-Bibliothek verwendet, pattet gevent die Socket-Bibliothek asynchron.
Ausgezeichnet! Vielen Dank. Gibt es irgendwelche Einschränkungen, die ich beachten sollte (die nicht in der Dokumentation erscheinen), wenn ich sie auf diese Weise benutze? – Matty
nicht sicher. Ich fand es schien besser zu funktionieren mit NullPool, die das Pooling deaktiviert. Sonst ließ es etwas hängen. Also vielleicht vorsichtig mit beginnen mit .. – zzzeek
@zzzeek Ihre hängt möglicherweise von SQLAlchemy's Standard-Pool (QueuePool) mit nicht-Affe-Patched Threading. Wenden Sie entweder gevent's affe patch an oder erstellen Sie eine grüne Version von QueuePool für das Beispiel unter https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ. Das hat das gleiche Verhalten repariert, als ich es hatte. – CryingCyclops
Werfen Sie einen Blick auf Tornado, da sie ein paar saubere blockierungsfreie Bibliotheken haben, besonders tornado.gen.
Wir verwenden das zusammen mit Momoko, eine nicht blockierende psycopg Wrapper-Bibliothek für Tornado. Es war bisher großartig. Der einzige Nachteil ist, dass Sie alle Modellobjekte, die Ihnen SQLAlchemy zur Verfügung stellt, verlieren. Leistung ist jedoch unwirklich.
Ich habe mir Tornado angeschaut und ich kann diesen Weg gehen. Vielleicht sollte ich etwas Demo-Code schreiben, um dies zu testen, aber wenn der psycopg-Treiber Async-Datenbankaufrufe unterstützt (was er anscheinend tut), dann wäre es möglich, nicht blockierende DB-Aufrufe mit SQLAlchemy zu machen. – Matty
@Matty Gute Idee, ich würde gerne hören, wie Sie damit gehen. Eines der Hauptprobleme, von denen ich mir vorstelle, dass Sie mit SQLAlchemy konfrontiert werden, ist nicht genau zu wissen, wann ein blockierender Anruf getätigt wird. Natürlich könntest du immer tief in den Code eintauchen, um herauszufinden, wann mein Bauch sagt, dass das eine Menge Arbeit sein wird. – kuhnza
@Kahunza Nach einem kurzen Blick auf die Dokumentation für psycopg2 erscheint ein Argument, das in die Verbindungszeichenfolge aufgenommen werden kann, die an die 'create_engine()' -Funktion von SQLAlchemy übergeben wird. Vielleicht wird einer der Betreuer reinhören oder ich werde auf ihrer Liste fragen. Prost! – Matty
Ohne die Hilfe von Greenlet, ist die Antwort nein, im Zusammenhang mit asyncio.
Es ist jedoch möglich, nur einen Teil von SQLAlchemy in asyncio zu verwenden. Finden Sie ein Beispiel in der GINO project, wo wir nur SQLAlchemy Kern ohne Engine und vollständige Ausführung Kontext verwendet, um eine einfache ORM in asyncio.
- 1. Ist fwrite nicht blockierend?
- 2. CoreOS-Cluster kann nicht richtig konfiguriert werden
- 3. Spring Boot: Kann nicht konfiguriert werden
- 4. OTP kann nicht mit Twilio konfiguriert werden
- 5. Wie kann man FIFO nicht blockierend lesen?
- 6. Ist Javascript synchron (blockierend) oder asynchron (nicht blockierend) standardmäßig
- 7. Anmelden Nicht blockierend spielen?
- 8. System.IO.Ports.SerialPort - Kann IOCTL_SERIAL_SET_WAIT_MASK konfiguriert werden?
- 9. Netzwerkblockierung auf nicht blockierend, nur Threads als Option?
- 10. Eingabe von sys.stdin, nicht blockierend
- 11. Wie ändere ich einen TCP-Socket als nicht blockierend?
- 12. TERMIOS kann nicht in SOCAT konfiguriert werden, xioinitialize: Assertion
- 13. Laravel-Datenbank erscheint als nicht konfiguriert?
- 14. Wo kann ActiveMQ-Hostname manuell konfiguriert werden?
- 15. SAPUI5 - Kann der Datepicker konfiguriert werden
- 16. Apigee TargetServer kann nicht für SSL konfiguriert werden
- 17. Warum ist die concurrent_queue nicht blockierend?
- 18. Kann 'json_extract_path_text' (Redshift) nicht mit sqlalchemy verwendet werden?
- 19. Python-Tastaturereignisse ohne GUI (nicht blockierend)
- 20. Kann der Android-Einstellungen/Einstellungen-Bildschirm so konfiguriert werden, dass andere Voreinstellungen als "DEFAULT" verwendet werden?
- 21. Kann ein Socket nur für die Funktion recv() nicht blockierend gemacht werden?
- 22. SQLAlchemy erlauben null als ForeignKey
- 23. Kann Visual Studio-Code zum Starten mit NodeMon konfiguriert werden
- 24. 403 Anforderungsrate höher als konfiguriert
- 25. Wie kann OC4J zur Unterstützung von Arabisch konfiguriert werden?
- 26. Paginierung kann nicht als nächstes verschoben werden
- 27. kann pip nicht als Befehl erkannt werden
- 28. BoundedPriorityBlockingQueue - threadsicher, blockierend und begrenzt?
- 29. konfiguriert easyPHP zu htm-Dateien als PHP
- 30. Kann SQLAlchemy mit Google Cloud SQL verwendet werden?
Kurze Antwort, nein. Es sind die Datenbankbibliotheken, die blockieren, nicht SQLalchemy selbst. Nichts hält dich davon ab, DB-Sachen in einem separaten Thread zu tun. – AdamKG
@AdamKG Dies sollte wahrscheinlich eine Antwort sein, kein Kommentar! :-) – Matty