[Python] web: sync vs. async

enrico franchi enrico.franchi a gmail.com
Ven 2 Dic 2011 16:07:10 CET


2011/12/2 Alessandro Dentella <sandro a e-den.it>

un cliente mi ha chiesto di aiutare a capire come rendere pių veloce una
> applicazione web che raccoglie dati da molti utenti differenti in
> contemporanea (qualche centinaio) e si ingolfa in particolari momenti
> del mese di maggior accesso.
>

Ora bisogna capire cosa devi fare con questi dati e quanti dati. Perche'
"di per se'" "qualche centinaio" non e' molti.
Nota che la questione e' rilevante: e' ovvio che tu hai un problema di
performance (perche' lo dici) ma i numeri che riporti non dovrebbero darlo.
A meno che il problema non sia altrove (e.g., questi ~ 400 utenti postano
una vagonata di update al secondo, devi fare conti molto pesanti sui loro
dati, hai tempi di risposta brevissimi, quasi rt).

Attualmente usano Tornado [1], un incrocio fra un server web ed un piccolo
> framework (che tramite un decoratore permette di rendere una funzione
> asincrona).
>

Qui potrei vedere una radice del problema. Non c'e' nulla che (in Python)
possa "rendere una funzione asincrona *e* buon cittadino di un framework
asincrono.

@asyn
def foo(...)
    for x in range(1000):
        for y in range(10000):
            for z in range(1000):
                ...

per esempio ti inchiodera' irrimediabilmente il tutto. E' vero che la
funzione ritorna subito, ma prima di avere il risultato lei si prende
comunque tutto il tempo necessario. Quindi non c'e' un decoratore che puo'
risolvere automaticamente il problema.

Questo e' ovviamente ovvio per te, ma e' meglio chiarirlo comunque. Se per
caso hai una situazione come quella di sopra, si puo' pensare a come
risolverla (ma ci vogliono piu' dettagli).



> Non ho alcuna esperienza di Tornado, qualche esperienza con twisted e
> qualche dubbio sul fatto che quel particolare problema abbia grandi
> vantaggi
> dall'approccio asincrono.


A me sembra invece proprio uno dei casi in cui e' vincente. Ovviamente *a
meno che* tu non debba fare conti pesanti.


> L'applicazione lato client usa intensamente ajax e
> molte chiamate al server che fanno pochi conti ed una manciata di select
> semplici o di piccole join.


Sembrerebbe di no.


> La macchina ha 4 processori e 4 GB di RAM
> (principalmente libera). Ogni chiamata dallo stesso client cambia dati
> nella
> sessione che devono quindi essere sincronizzati fra una chiamata e l'altra.
>

Guarda, a naso per come hai descritto il problema non darebbe problemi al
mio portatile.
Probabilmente c'e' qualcosa che ci sfugge.



-- 
.
..: -enrico-
-------------- parte successiva --------------
Un allegato HTML č stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20111202/dc3204e8/attachment.html>


Maggiori informazioni sulla lista Python