[Python] web: sync vs. async
Daniele Varrazzo
piro a develer.com
Ven 2 Dic 2011 21:44:26 CET
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...
> 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)
Scusa, ma tu veramente ti sentiresti di consigliare una soluzione web
python basata su thread e di sostenere che questa possa scalare? Non
parlo di milioni di utenti, parlo di centinaia. Veramente ritieni che
buttare thread in python sia una soluzione buona quanto usare metodi
asincroni nei diversi modi possibili (greenlet, twisted, yield-based
ecc).
> 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. 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...) 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.
Il problema di Alessandro non è quello di scalare: ha verificato che la
sua macchina è praticamente inattiva per tutto il tempo. Se risolve il
problema del database che lo blocca dovrebbe stare a cavallo. Poi non è
che si sia prodigato in dettagli: magari il blocco è nel db che offre
poche connessioni, non si sa se il db sia sulla stessa macchina... un
po' di lavoro deve farlo anche lui, non possiamo mica debuggare con la
telepatia, no? :) Magari quella cosa di psycopg + async funziona bene:
in fondo quella di twisted pare vada. E non lo costringerebbe a scrivere
il programma da zero.
Ciao!
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Maggiori informazioni sulla lista
Python