[Python] Connessioni asincrone verso i database
Manlio Perillo
manlio.perillo a gmail.com
Ven 22 Gen 2010 14:09:54 CET
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Alessandro Agosto ha scritto:
>
>
> Il giorno 21 gennaio 2010 23.12, Manlio Perillo
> <manlio_perillo a libero.it <mailto:manlio_perillo a libero.it>> ha scritto:
> [...]
> psycopg2 (uno delle implementazioni DBAPI2 più utilizzate per
> PostgreSQL) ha cercato di implementarne il supporto, ma l'autore ci ha
> rinunciato.
>
> Uhm, questo non mi fà ben sperare. Sapresti per caso indicarmi qualche
> discussione o altra risorsa in cui parla dei problemi a cui è andato in
> contro?
>
Al momento non ricordo, cerca nella mailing list di psycopg.
> > Altrimenti, se ho scritto una app in python che non è basata su
> twisted
> > ma volessi usare una delle sue interfacce asincrone per la connessione
> > ai db avrei qualche problema?
>
> Probabilmente si.
>
> Allora l'unica soluzione credo sia testarle, magari con una semplice app
> wsgi su un webserver asincrono.
>
Io per Twisted ho implementato un client in puro Python per PostgreSQL:
http://hg.mperillo.ath.cx/twisted/pglib/
Ma non l'ho mai usato in produzione.
> Una interfaccia asincrona ti permette di non bloccare un intero thread
> mentre stai aspettando i dati dal database.
> Per fare questo hai bisogno di un qualche sistema che ti dica quando un
> socket è pronto per essere letto.
>
> Quando ho scritto il primo modulo di estensione in python ho utilizzato
> picoev, una piccola libreria che permette una astrazione sopra le
> interfacce epoll/kqueue/select (a differenza di libev, supporta solo
> questi metodi e non è altrettanto matura, ma secondo quanto ho visto
> sembra molto promettente) e m'era balzata in testa l'idea di provare a
> usare l'interfaccia odbc e farla passare attraverso il suo loop, ma poi
> m'è venuto il dubbio che potesse lo stesso bloccarmi l'intera
> applicazione,
Non dovrebbe.
L'importante è che tu abbia un solo main loop per thread/processo.
> e cosa più importante, dall'ignoranza che ho verso le api
> a disposizione per effettuare connessioni verso i db, mi pare che queste
> "nascondano" la socket di connessione... poi magari mi sbaglio ma ad
> esempio guardando il link che mi hai passato su postgres parla di socket
> ma non dice che la funzione di connessione ritorna una referenza alla
> socket usata...
No, è documentato da un altra parte:
http://www.postgresql.org/docs/8.4/static/libpq-status.html
`PQsocket`.
> [...]
> La programmazione asincrona non è banale, e non si integra bene con il
> resto del mondo che è sincrono.
>
> Purtroppo è quello che si vede/legge in ogni guida :( Basta un niente
> che venga usato dalla tua applicazione che faccia operazioni di I/O in
> modo non asincrono per annullare gli sforzi fatti.
>
Non accade spesso.
L'unico caso reale che mi viene in mente è quello in cui tu debba fare
una richiesta HTTP ad un server esterno.
> Un po' è un peccato però, alcuni webserver python sono asincroni ma
> ahimè non ha molto senso usare una app senza db, e mi sorprende che
> nessuno si sia mai messo seriamente a pensare qualche soluzione. :s
>
Per applicazioni e database decenti, le query non ci mettono molto ad
essere eseguite.
Ed il database è comunque sullo stesso server o sulla stessa LAN.
Questo tipo di latenze si possono risolvere utilizzando un server che
usi più di un processo per servire le richieste HTTP.
> Ciao manlio e grazie mille per la risposta :)
Di nulla, ciao.
Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAktZo6IACgkQscQJ24LbaURNxwCfV5GVLFUAqx6qWTrWdzMGTloa
EUwAnA8NPsrD4FLc+/Er9vT8xQZcIJbf
=TMdZ
-----END PGP SIGNATURE-----
Maggiori informazioni sulla lista
Python