[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