[Python] web: sync vs. async
Manlio Perillo
manlio.perillo a gmail.com
Ven 2 Dic 2011 22:53:17 CET
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Il 02/12/2011 21:44, Daniele Varrazzo ha scritto:
> On Fri, 02 Dec 2011 20:18:18 +0100, Manlio Perillo wrote:
>
>> IMHO, nel caso in questione, è meglio cambiare web server usando ad
>> esempio Apache + mod_wsgi.
>
> Chiedi ad AD se ha voglia di riscrivere tutto il programma...
>
Non conosco Tornado, ma stavo assumendo offrisse un API compatibile con
WSGI, in modo che il porting ad un altro web server sia quasi immediato.
>> 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).
>
> Stai sempre parlando di scrivere un programma da zero con certe
> specifiche, tipo non avere stato al di fuori del database, che non è
> detto siano quelle di Alessandro (lui ha detto "Ogni chiamata dallo
> stesso client cambia dati nella sessione che devono quindi essere
> sincronizzati fra una chiamata e l'altra": non so se intende stato in
> memoria o nel db; il process pooling dell'applicazione implica zero
> stato per client in memoria)
>
Si, è da verificare.
> Scusa, ma tu veramente ti sentiresti di consigliare una soluzione web
> python basata su thread e di sostenere che questa possa scalare?
Non ho mai detto una cosa del genere.
Anzi, mi sembra di aver detto chiaramente che, dato che Alessandro non
ha bisogno di scalare, **non** ha bisogno di usare cose come Tornado ma
può fare affidamento sul robusto Apache + mod_wsgi.
Di default io non userei i thread, comunque.
> Non
> parlo di milioni di utenti, parlo di centinaia.
E credi che Apache abbia problemi con questo tipo di concorrenza?
Non ho esperienza diretta, ma mi sembrerebbe strano.
Probabilmente sprechi più memoria.
> Veramente ritieni che
> buttare thread in python sia una soluzione buona quanto usare metodi
> asincroni nei diversi modi possibili (greenlet, twisted, yield-based ecc).
>
Se devi sopportare carichi non eccessivi credo di si.
>> 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.
>
> I thread non sono una faccenda di risorse sprecate su Python: sono una
> faccenda di lock contention, e scala maledettamente male: nelle poche
> decine, anche se la macchina permetterebbe ben altro.
Il collo di bottiglia di Alessandro sembra essere l'accesso al database,
e psycopg2 rilascia il lock.
> Nessuno dei nostri
> programmi (sia web che altro, ma con necessità di concorrenza) è
> "sopravvissuto al proprio successo" senza venire sbudellato (chi
> ribasato su greenlet, chi riscritto in erlang...)
Usando thread o processi?
Che tipo di hardware e che web server (nel caso di applicazioni web)?
Quante connessioni concorrenti?
Infine una curiosità: assumendo che sia il vecchio che il nuovo
application server offrano WSGI e che nel nuovo usi greenlet, quanto
impegno ha preso la riscrittura dell'applicazione?
> Il sito web di cui ho
> parlato oggi ha pochi clienti ma è molto cpu-intensive e nei giorni di
> maggiore attività non reggeva 80 clienti connessi prima di splittarlo.
>
Splittarlo su N processi fissi: quindi mi aspetto che Apache + mod_wsgi
con N processi worker non abbia troppi problemi.
Magari mi aspetto troppo da Apache, ma se la tua soluzione funziona e
Apache no, significa che mi sono perso qualcosa.
> [...]
Ciao Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk7ZSMwACgkQscQJ24LbaURoHgCfdumEfrFFnvuG+YZI2Dt8F+CN
knoAoIil0x0Ti08LxBDZE3jt1S8z/LMA
=OH73
-----END PGP SIGNATURE-----
Maggiori informazioni sulla lista
Python