[Python] web: sync vs. async

Manlio Perillo manlio.perillo a gmail.com
Ven 2 Dic 2011 20:18:18 CET


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 02/12/2011 19:31, Daniele Varrazzo ha scritto:
> [...]
> 
>> 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.


IMHO, nel caso in questione, è meglio cambiare web server usando ad
esempio Apache + mod_wsgi.
In questo caso hai un pool di processi che gestiscono le richieste e
dovresti essere a posto (ma hai anche la possibilità di usare i thread,
e con psycopg2 può essere una alternativa).

Comincerei a pensare di usare un server non bloccante (e magari le
greenlet per avere una API familiare) *solo* se l'applicazione deve
scalare su migliaia di richieste ed è fondamentale non sprecare risorse
su processi/threads.


Personalmente, per applicazioni di cui non mi preoccupa l'elevata
concorrenza, utilizzo nginx + il mio ngx_http_wsgi_module, in cui
imposto il numero di worker di Nginx pari a 2 x ncpu.

Ciascun worker serve una sola request alla volta.
Il consumo di CPU e memoria in questo caso è minimo, e mi posso
aspettare una certa robustezza di tutta la baracca.


> [...]


Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk7ZJHoACgkQscQJ24LbaUQ02wCgiKqGCZBWAi5ZPhuHYCg2SAau
9FIAoJDYdYKrnV64DXdHVaB8FD7wYnZZ
=5IJb
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python