On Fri, 2 Dec 2011 19:03:19 +0100, Alessandro Dentella wrote:
On Fri, Dec 02, 2011 at 04:04:05PM +0000, Daniele Varrazzo wrote:

Scusa, per curiosità...

come fa il magicamente asincrono tornado ad accedere al database?

ok, questo è per me il nocciolo. Attualmente usano SqlAlchemy 0.6.8 +
psycopg2 2.0.3.  La mia lettura è che mettono una chiamata che non è
asincrona in un RequestHandler, il risultato è di serializzare la risposta
invece che parallelizzarla usando chiamate asincrone.

Esatto.


Credo che dovrei venirne fuori o rendendo asincrona la chiamata via
SqlAlchemy (come?) o aumentando i thread della risposta. Sbaglio?

Il problema è a valle di sqlalchemy: la dbapi è bloccante: cur.execute() blocca finchè non ottieni una risposta.

Le soluzioni sono 2: quella twisted è di cambiare l'interfaccia della dbapi, inventarsi la ADBAPI, dove passi un callback quando verrà eseguito. tx_postgres wrappa psycopg e usa questa soluzione. Ovviamente devi riscrivere tutto il mondo, perché niente deve essere bloccante.

Ma la soluzione più figa (sono di parte, me la sono inventata io) è quella di aggiungere un hook a psycopg, passargli un callback che viene invocato quando la chiamata bloccherà. Con questo callback psycopg "chiede di essere bloccato" passando la palla allo scheduler dei greenlet che può schedulare un thread switch. Il singolo greenlet resta bloccato ma gli altri continuano. L'hook è implementato per gevent, eventlet e uWSGI che io sappia. Dettagli su <http://initd.org/psycopg/docs/advanced.html#support-to-coroutine-libraries>.

Se tornado ha un metodo per mettere un file descriptor in attesa allora puoi scrivere un hook per rendere psycopg non bloccante. Altrimenti sei fregato.

Ho googlato e tornado sembra essere implementato a callback come twisted (http://golubenco.org/2009/09/19/understanding-the-code-inside-tornado-the-asynchronous-web-server-powering-friendfeed/), quindi mi sa che la wait callback non può essere usata, Vedi se questo <http://61924.nl/03-09-2011/async-psycopg-for-tornado.html> sa quello che fa...


--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a