[Python] web: sync vs. async

Giampaolo Rodolà g.rodola a gmail.com
Sab 3 Dic 2011 14:07:37 CET


Il 02 dicembre 2011 16:18, Daniele Varrazzo <piro a develer.com> ha scritto:
> Io ho messo 4 server in ascolto su 4 porte diverse: il primo sulla standard
> https 443 e altre 8444, 8445, 8446 (la bella copia sarebbe avere 4
> sub-domain, ma per ora abbiamo solo un certificato ssh).
>
> Quando un utente si connette, viene rediretto ad un certo nodo (id utente %
> n. nodi, per esempio). Da lì in poi tutti i link del programma sono
> relativi, per cui una volta che è andato sul server https://host:8445, ci
> resta. Il suo nodo di appartenenza è anche memorizzato al momento del login
> nella sua sessione del server: ad ogni richiesta viene controllato che sia
> sul server giusto e, se non lo è, gli viene servito un redirect per
> mandarcelo.
>
> Questa soluzione consente di usare tutte le cpu sulla macchina nella maniera
> migliore possibile: con diversi processi. Perché funzioni si assume che gli
> utenti non si scambino dati tra loro se non attraverso il database. Invece
> poiché un utente resta sempre sullo stesso server, i suoi dati di sessione
> sono sempre disponibili. Per scalare di più possiamo aggiungere nuovi
> processi (la nostra macchina ha 16 cpu) o anche aggiungere nuove macchine.

Una cosa di questo tipo non avrebbe ugualmente funzionato?

# pseudo codice
import multiprocessing
from somehttpd import HTTPServer

CPUS = multiprocessing.cpu_count()
server = HTTPServer()
# create child processes to act as workers
for x in range(CPUS - 1):
    Process(target=server.serve_forever).start()
# main process also acts as a worker
server.serve_forever()


Se si, ti saresti evitato l'onere di ascoltare su porte multiple e
ovviamente tutta la complessità aggiuntiva che ne deriva.


--- Giampaolo
http://code.google.com/p/pyftpdlib/
http://code.google.com/p/psutil/


Maggiori informazioni sulla lista Python