[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