[Python] web: sync vs. async

Alessandro Dentella sandro a e-den.it
Sab 3 Dic 2011 00:36:18 CET


On Fri, Dec 02, 2011 at 08:44:26PM +0000, Daniele Varrazzo wrote:
> 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? :) 

ok, bando alla telepatia... fino a mercoledė stava tutto su una macchina,
ora sta su due, due processi di tornado, un database unico, redis per utenti
e sessioni. La sessione viene scritta su redis come store.

Una istanza di nginx fa da load balancer. Le macchine sono virtualizzate con
VmWare.

> 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.

L'applicazione per quel che ho visto finora č veramente piccola, la
riscrittura, se necessaria sarebbe probabilmente sopportabile, considerando
che molto codice verrebbe riutilizzato.

Sostanzialmente č un foglio elettronico via web, al cambio cella il server
deve calcolare il valore. Lato client č ajax, quindi intrinsecamente
asincrono, ma l'utente vuole vedere subito i valori aggiornati.  Domani mi
dedico a leggere il codice eseguito lato server ma mi pare poco.

In ogni caso anche nel caso suggerito da Daniele vedo qualche riscrittura,
se non altro per il fatto che la soluzione che ha indicato non usa
sqlalchemy ma direttamente psycopg2.

> 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)

*al momento* stanno in memoria (e salvate su redis). Nginx tramite la
 direttiva ip_hash mantiene lo stesso ip sullo stesso server dove al momento
 gira una sola istanza di tornado. 

Nel caso di pių processi su porte differenti, come suggerito da Daniele, non
č concettualmente differente da quanto fatto ora, nel caso di pių thread o
pių processi come potrebbero essere avviati da mod_wsgi, esiste un modo di
garantire l'abbinamento fra un client e "la sua" istanza, sempre quella?
Avevo letto un post del 2007 che indicava come prossimo sviluppo per
mod_wsgi un sistema di stycky session e mi pare che questo mail [1] lo
convalidi. 

sandro


[1] http://groups.google.com/group/modwsgi/browse_thread/thread/b26ba3894632fb0a/51545a7c05bdf6ce



Maggiori informazioni sulla lista Python