Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Manlio Perillo
2014-03-16 19:40 GMT+01:00 Roberto De Ioris robe...@unbit.it:

 [...]
  Le alternative che *io* vedo sono tutte architetturali, ovvero mettersi
  nell'ordine di idee di avere un pool di worker fuori dall'app web e
  delegare quasi ogni cosa li.


 Che sono le stesse che propongo io, django riceve la richiesta, fa tutti i
 controlli del caso (come l'autenticazione) e poi passa la connessione (o
 tramite proxy o tramite fd-passing su socket unix) al backend gevent che
 continua a gestire la sessione liberando django.

 Forse mi sono perso qualcosa, ma quale è la differenza tra questa
soluzione ed avere Apache prefork con N + M processi?

La soluzione che hai indicato è quella tipica frontend + backend, nel caso
in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
farlo).

Ma davvero ci sono vantaggi in un ulteriore livello, in cui l'applicazione
Django minimale fa da frontend e tutto il resto (inclusa connessione al
database) la fa un ulteriore backend?


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Roberto De Ioris

 2014-03-16 19:40 GMT+01:00 Roberto De Ioris robe...@unbit.it:

 [...]
  Le alternative che *io* vedo sono tutte architetturali, ovvero
 mettersi
  nell'ordine di idee di avere un pool di worker fuori dall'app web e
  delegare quasi ogni cosa li.


 Che sono le stesse che propongo io, django riceve la richiesta, fa tutti
 i
 controlli del caso (come l'autenticazione) e poi passa la connessione (o
 tramite proxy o tramite fd-passing su socket unix) al backend gevent che
 continua a gestire la sessione liberando django.

 Forse mi sono perso qualcosa, ma quale è la differenza tra questa
 soluzione ed avere Apache prefork con N + M processi?

 La soluzione che hai indicato è quella tipica frontend + backend, nel caso
 in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
 farlo).

 Ma davvero ci sono vantaggi in un ulteriore livello, in cui l'applicazione
 Django minimale fa da frontend e tutto il resto (inclusa connessione al
 database) la fa un ulteriore backend?


Ti faccio l'esempio di un progetto sui cui ho lavorato di recente che deve
fornire notifiche (tramite SSE) in tempo reale, scrivendo dei testi in un
div.

La parte SSE all'inizio deve essere comunque autenticata, deve prendere
dei dati dal db per scegliere che tipo di informazioni mi servono, dopo di
che django non serve piu', i dati che mi arrivano sono presi da redis.

Quindi una volta che django ha autenticato l'utente, e scelto cosa fargli
vedere, passa la connessione (la tecnica usata e' irrilevante) al livello
back-backend (chiamiamolo cosi') che si occupa di leggere in maniera non
bloccante da una coda redis e inviare le informazioni (e la cosa potrebbe
durare ore). A questo punto django ha finito il suo ciclo di richiesta ed
e' pronto a gestirne un' altra.

Il giro e'

proxy non bloccante - application server bloccante - application server
non bloccante.

Non parlerei di vantaggi, ma di necessita', far digerire a django il
modello gevent (o quello che sia) e' talmente tedioso come processo che
tanto vale aggiungere un ulteriore strato. E' un po' piu' macchinoso senza
dubbio, ma non ha (teoricamente) sorprese sul medio e lungo termine.

Io non metto in dubbio che avere tutto non bloccante da cima a fondo sia
l'approccio migliore, ma una azienda che ha investito in Django non passa
a tornado da un giorno all'altro (o a nodejs o a Go o a Rust ecc. ecc.),
quindi bisogna ricorrere a workaround che comunque mantengano un certo di
grado di solidita'. (e poi devo ancora trovarne di framework
non-blocking-friendly che siano al livello di django)

Poi se alcune aziende ci riescono, buon per loro, hanno il mio rispetto e
la mia somma invidia :)

-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Manlio Perillo
2014-03-15 7:42 GMT+01:00 Nicola Larosa n...@teknico.net:

 Manlio Perillo wrote:

  [...]

  Twisted offre un framework per la programmazione asincrona da anni,
 ma non è mai stato di moda, perchè molto più difficile.


 Non ha avuto grande successo per vari altri motivi: avanti sui suoi
 tempi, documentazione carente, e anche insistenza sulla sintassi a
 callback preferita alle inline callback.


Secondo me molto ha influito il fatto che non fosse compatibile con il
resto del mondo Python.



  Considerato tutti i problemi che gli utenti hanno con tornado e
 friends (e che nemmeno sanno di sapere), direi che, come sempre,
 explicit is better than implicit.


 Poco ma sicuro. Creare punti impliciti di cambio di contesto, come fanno
 gevent ed eventlet, e come fanno i thread preemptive, è ingestibile.


Si, ma con gevent i punti di cambio di contesto sono deterministici.
Non sono espliciti, ma se la libreria che usa le coroutine è scritta bene
sai dove può avvenire lo switch, anche se magari sommerso tra 5-10 funzioni
(cosa non bella, in effetti, ma è proprio uno dei problemi con yield che
ti devi portare dietro sempre)



  Il mio suggerimento è sempre quello di imparare prima le basi (vicino
 a quello che realmente succede) e solo dopo utilizzare cose che
 rendono la programmazione e manutenzione più semplice.


 Se con questo intendi passare per la sintassi a callback prima di usare
 la pseudo sincrona, non sono d'accordo.


No, indendevo capire quello che succede sotto il cofano, altrimento non
ci si rende conto dei possibili problemi e/o come risolverli.


 Non si tratta di basi, è
 semplicemente un modo diverso, molto meno leggibile, di scrivere codice
 asincrono.

 Ormai le Promises ci sono anche in Javascript, non ha senso insistere col
 vecchio modello. Però andare troppo oltre e rinunciare agli yield, che
 marcano i punti di cambio di contesto, significa andarsela a cercare.

 Glyph Lefkowitz, cioè Mr. Twisted, fa un'ottima panoramica delle opzioni
 disponibili, ed illustra bene i pericoli di usare una sintassi implicita:

 1. Straight callbacks: Twisted’s IProtocol, JavaScript’s onfoo idiom,
 where you give a callback to something which will call it later and then
 return control to something (usually a main loop) which will execute
 those callbacks,

 2. “Managed” callbacks, or Futures: Twisted’s Deferred, JavaScript’s
 Promises/A[+], E’s Promises, where you create a dedicated
 result-that-will-be-available-in-the-future object and return it for the
 caller to add callbacks to,

 3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield from
 coroutines, C#’s async/await, where you have a syntactic feature that
 explicitly suspends the current routine,

 4. and finally, implicit coroutines: Java’s “green threads”, Twisted’s
 Corotwine, eventlet, gevent, where any function may switch the entire
 stack of the current thread of control by calling a function which
 suspends it.


Go non ha una sintassi per sospendere esplicitamente una goroutine; quindi
appartiene a 4) ?

 [...]


Ciao   Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Nicola Larosa

Nicola Larosa wrote:

3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield
from coroutines, C#’s async/await, where you have a syntactic
feature that explicitly suspends the current routine,

4. and finally, implicit coroutines: Java’s “green threads”,
Twisted’s Corotwine, eventlet, gevent, where any function may
switch the entire stack of the current thread of control by calling
a function which suspends it.


Manlio Perillo wrote:

Go non ha una sintassi per sospendere esplicitamente una goroutine;
quindi appartiene a 4)?


La sospensione avviene quando una goroutine manda un valore su un canale
non bufferizzato: fin quando un'altra goroutine non legge quel valore, la
prima è bloccata.

E poi ovviamente anche quando una goroutine riceve un valore da un canale
non bufferizzato, o vuoto.

Invio e ricezione fanno parte della sintassi del linguaggio, tramite gli 
operatori freccia - e -.


--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Manlio Perillo
On Mon, Mar 17, 2014 at 12:34 PM, Nicola Larosa n...@teknico.net wrote:

 Nicola Larosa wrote:

 3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield
 from coroutines, C#’s async/await, where you have a syntactic
 feature that explicitly suspends the current routine,

 4. and finally, implicit coroutines: Java’s “green threads”,
 Twisted’s Corotwine, eventlet, gevent, where any function may
 switch the entire stack of the current thread of control by calling
 a function which suspends it.


 Manlio Perillo wrote:

 Go non ha una sintassi per sospendere esplicitamente una goroutine;
 quindi appartiene a 4)?


 La sospensione avviene quando una goroutine manda un valore su un canale
 non bufferizzato: fin quando un'altra goroutine non legge quel valore, la
 prima è bloccata.

 E poi ovviamente anche quando una goroutine riceve un valore da un canale
 non bufferizzato, o vuoto.

 Invio e ricezione fanno parte della sintassi del linguaggio, tramite gli
 operatori freccia - e -.



Si, ma una scrittuta/lettura su un canale possono essere nidificate
all'interno di N funzioni.  Non è' lo stesso di quello che accade con
gevent?

Con yield è diverso, perchè deve essere presente in ogni livello di
chiamata a funzione.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Per discussione Manlio Perillo
2014-03-17 11:22 GMT+01:00 Roberto De Ioris robe...@unbit.it:

  [...]
  Forse mi sono perso qualcosa, ma quale è la differenza tra questa
  soluzione ed avere Apache prefork con N + M processi?
 
  La soluzione che hai indicato è quella tipica frontend + backend, nel
 caso
  in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
  farlo).
 
  Ma davvero ci sono vantaggi in un ulteriore livello, in cui
 l'applicazione
  Django minimale fa da frontend e tutto il resto (inclusa connessione al
  database) la fa un ulteriore backend?
 

 Ti faccio l'esempio di un progetto sui cui ho lavorato di recente che deve
 fornire notifiche (tramite SSE) in tempo reale, scrivendo dei testi in un
 div.

 La parte SSE all'inizio deve essere comunque autenticata, deve prendere
 dei dati dal db per scegliere che tipo di informazioni mi servono, dopo di
 che django non serve piu', i dati che mi arrivano sono presi da redis.

 Quindi una volta che django ha autenticato l'utente, e scelto cosa fargli
 vedere, passa la connessione (la tecnica usata e' irrilevante)


Irrilevante, ma altamente dipendente dal sistema operativo e non tutti la
supportano :)


 al livello
 back-backend (chiamiamolo cosi') che si occupa di leggere in maniera non
 bloccante da una coda redis e inviare le informazioni (e la cosa potrebbe
 durare ore). A questo punto django ha finito il suo ciclo di richiesta ed
 e' pronto a gestirne un' altra.


In effetti questo è un caso particolare che non avevo considerato.


 Il giro e'

 proxy non bloccante - application server bloccante - application server
 non bloccante.

 Non parlerei di vantaggi, ma di necessita', far digerire a django il
 modello gevent (o quello che sia) e' talmente tedioso come processo che
 tanto vale aggiungere un ulteriore strato. E' un po' piu' macchinoso senza
 dubbio, ma non ha (teoricamente) sorprese sul medio e lungo termine.


Questo non è un caso d'uso dei web sockets?
Il problema è l'autenticazione; con la soluzione attuale il back-back-end
riceve dati da una fonte sicura.
Però con i websockets potresti disaccoppiare completamente i due backend
(?).


 Io non metto in dubbio che avere tutto non bloccante da cima a fondo sia
 l'approccio migliore, ma una azienda che ha investito in Django non passa
 a tornado da un giorno all'altro (o a nodejs o a Go o a Rust ecc. ecc.),
 quindi bisogna ricorrere a workaround che comunque mantengano un certo di
 grado di solidita'. (e poi devo ancora trovarne di framework
 non-blocking-friendly che siano al livello di django)


Vero, ma bisogna stare attenti a non cadere nella sindrome dell'utilizzo a
tutti costi perchè è l'unica cosa che conosco/conoscono gli altri.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-16 Per discussione enrico franchi
2014-03-16 4:46 GMT+00:00 Roberto De Ioris robe...@unbit.it:

 Mi rendo conto che non e' un approccio molto tecnico, ma francamente
 sentirmi dire che cazzo dici !!! ho letto sul blog di topogigio che si
 puo' fare e senza sforzo, beh un pochino mi rode...


Scusa, ma esattamente la soluzione quale sarebbe?
Perche' niente da dire sul fare chiarezza riguardo i problemi di gevent e
simili, ma io non e' che vedo molte soluzioni.

Perche' programmare multithreading preemptivo ha pure tutti i suoi
problemi, multiprocesso puro scala solo fino ad un certo punto e lavorare
interamente a callback ha pure gli stessi problemi di gevent dal punto di
vista di quello che *non* puoi fare (se non che quelli di twisted sono
stati piu' chiari nel dire chiaro e tondo quello che *non* potevi fare
gratis) e mi pare di ricordare che lo trovi molto meno comodo -- e se non
fosse che mi sono girato la testa per trovare naturale CPS e sono fatto
strano io -- sono in essenza d'accordo.

Le alternative che *io* vedo sono tutte architetturali, ovvero mettersi
nell'ordine di idee di avere un pool di worker fuori dall'app web e
delegare quasi ogni cosa li.

D'altra parte i problemi di dare in mano qualcosa di asincrono a chi non ha
idea sono ben esemplificati da quello che succede a molta gente che cerca
di fare roba con node.js.


-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-16 Per discussione Roberto De Ioris

 2014-03-16 4:46 GMT+00:00 Roberto De Ioris robe...@unbit.it:

 Mi rendo conto che non e' un approccio molto tecnico, ma francamente
 sentirmi dire che cazzo dici !!! ho letto sul blog di topogigio che si
 puo' fare e senza sforzo, beh un pochino mi rode...


 Scusa, ma esattamente la soluzione quale sarebbe?
 Perche' niente da dire sul fare chiarezza riguardo i problemi di gevent e
 simili, ma io non e' che vedo molte soluzioni.

 Perche' programmare multithreading preemptivo ha pure tutti i suoi
 problemi, multiprocesso puro scala solo fino ad un certo punto e lavorare
 interamente a callback ha pure gli stessi problemi di gevent dal punto di
 vista di quello che *non* puoi fare (se non che quelli di twisted sono
 stati piu' chiari nel dire chiaro e tondo quello che *non* potevi fare
 gratis) e mi pare di ricordare che lo trovi molto meno comodo -- e se non
 fosse che mi sono girato la testa per trovare naturale CPS e sono fatto
 strano io -- sono in essenza d'accordo.

 Le alternative che *io* vedo sono tutte architetturali, ovvero mettersi
 nell'ordine di idee di avere un pool di worker fuori dall'app web e
 delegare quasi ogni cosa li.


Che sono le stesse che propongo io, django riceve la richiesta, fa tutti i
controlli del caso (come l'autenticazione) e poi passa la connessione (o
tramite proxy o tramite fd-passing su socket unix) al backend gevent che
continua a gestire la sessione liberando django. Il client non si accorge
di nulla.

Se ci sono altri modi piu' semplici, io personalmente non li ho trovati.

--
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-16 Per discussione enrico franchi
2014-03-16 18:40 GMT+00:00 Roberto De Ioris robe...@unbit.it:

 Che sono le stesse che propongo io, django riceve la richiesta, fa tutti i
 controlli del caso (come l'autenticazione) e poi passa la connessione (o
 tramite proxy o tramite fd-passing su socket unix) al backend gevent che
 continua a gestire la sessione liberando django. Il client non si accorge
 di nulla.

 Se ci sono altri modi piu' semplici, io personalmente non li ho trovati.


Ah no, sono d'accordo. In generale non c'e' molto che puoi fare.
Ad un certo punto abbiamo tirato su un accrocchio con multiprocess e
django[0] che grida vendetta ma funziona decisamente meglio delle
alternative.

Parlami dell'fd-passing, mi interessa. So come farlo in C, ma non ho mai
provato in Python direttamente.
E poi che passi, direttamente il socket della request e quindi fai anche lo
string munching per costruire le pagine nel backend?


--
[0] django per inciso si era spaccato malissimo ai timidi tentativi di
multi-patching di gevent, viceversa, tirare su processi con multiprocess e
patchare quelli funziona benino. Certo... appena ho tempo celery o simile e
tanti calci di meno. Pero' per qualcosa che e' stato messo su a calci in un
pomeriggio ha funzionato bene.

-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Nicola Larosa

Manlio Perillo wrote:

Come vedi diventa molto complicato, specialmente se ad esempio devi
fare il parsing di un protocollo come HTTP (puoi vedere il codice di
Twisted se ti interessa).


Twisted non si limita alle callback lisce ma ne gestisce esplicitamente i
flusso (con i Deferred), e supporta anche la sintassi pseudo sincrona,
stile coroutine, tramite le inline callbacks (opzioni 1, 2 e 3 sotto).

Lo stesso fa Tornado.



Tra l'altro il motivo perchè tornado va di moda è perchè permette di
avere il codice che è praticamente lo stesso di quello normale, ma
che si comporta in modo completamente diverso.


Cioè la sintassi pseudo sincrona. Tornado supporta anche la sintassi a
callback gestita (tramite i Future).



Twisted offre un framework per la programmazione asincrona da anni,
ma non è mai stato di moda, perchè molto più difficile.


Non ha avuto grande successo per vari altri motivi: avanti sui suoi
tempi, documentazione carente, e anche insistenza sulla sintassi a
callback preferita alle inline callback.



Considerato tutti i problemi che gli utenti hanno con tornado e
friends (e che nemmeno sanno di sapere), direi che, come sempre,
explicit is better than implicit.


Poco ma sicuro. Creare punti impliciti di cambio di contesto, come fanno
gevent ed eventlet, e come fanno i thread preemptive, è ingestibile.


Un linguaggio recente come Go usa solo la sintassi pseudo sincrona,
tramite goroutine e channel. Però lo scheduler è preemptive e il runtime
fa un mapping N-to-M delle goroutine ai thread di sistema, permettendo di
usare in modo trasparente tutti i core di CPU disponibili.

Quest'approccio consente di mischiare in modo trasparente codice sincrono
e asincrono. Devo invocare un adapter db sincrono, cioè bloccante? Non
devo preoccuparmi di incapsulare manualmente la chiamata in un thread o
processo separato: il runtime si accorgerà che il thread assegnato è
bloccato, e sposterà automaticamente le altre goroutine assegnate a quel
thread su altri thread.

Essendo comunque un sistema preemptive a stato condiviso, rimane al
programmatore la responsabilità di non reintrodurre i problemi del
multithreading classico. Il linguaggio incoraggia l'approccio robusto, ma
non lo rende obbligato.

Approfondimenti:

The Go scheduler
http://morsmachine.dk/go-scheduler

Why is this Go code blocking?
http://stackoverflow.com/questions/12413510/why-is-this-go-code-blocking



Il mio suggerimento è sempre quello di imparare prima le basi (vicino
a quello che realmente succede) e solo dopo utilizzare cose che
rendono la programmazione e manutenzione più semplice.


Se con questo intendi passare per la sintassi a callback prima di usare
la pseudo sincrona, non sono d'accordo. Non si tratta di basi, è
semplicemente un modo diverso, molto meno leggibile, di scrivere codice
asincrono.

Ormai le Promises ci sono anche in Javascript, non ha senso insistere col
vecchio modello. Però andare troppo oltre e rinunciare agli yield, che
marcano i punti di cambio di contesto, significa andarsela a cercare.

Glyph Lefkowitz, cioè Mr. Twisted, fa un'ottima panoramica delle opzioni
disponibili, ed illustra bene i pericoli di usare una sintassi implicita:

1. Straight callbacks: Twisted’s IProtocol, JavaScript’s onfoo idiom,
where you give a callback to something which will call it later and then
return control to something (usually a main loop) which will execute
those callbacks,

2. “Managed” callbacks, or Futures: Twisted’s Deferred, JavaScript’s
Promises/A[+], E’s Promises, where you create a dedicated
result-that-will-be-available-in-the-future object and return it for the
caller to add callbacks to,

3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield from
coroutines, C#’s async/await, where you have a syntactic feature that
explicitly suspends the current routine,

4. and finally, implicit coroutines: Java’s “green threads”, Twisted’s
Corotwine, eventlet, gevent, where any function may switch the entire
stack of the current thread of control by calling a function which
suspends it.

One of these things is not like the others; one of these things just
doesn’t belong.

Unyielding - Deciphering Glyph
https://glyph.twistedmatrix.com/2014/02/unyielding.html

L'opzione fuori posto è ovviamente la quarta.

--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Daniele Varrazzo

On 2014-03-15 05:54, Nicola Larosa wrote:

Daniele Varrazzo wrote:
Purtroppo tulip non si integra bene con il supporto green di 
psycopg,

perché è basato su yield


Chissà come mai Guido ci tiene tanto a questa seccatura dello 
yield...




con tutti gli yeldini al posto loro.


E non solo lui, a quanto pare. Ecco ben spiegata la prospettiva di
noi comuni mortali che bizzarramente ci teniamo così tanto ad avere
tutti gli yeldini al posto loro.


Quello di essere espliciti è senz'altro un modello superiore. Il modo 
green è solo un truccazzo per avere interfacce bloccanti in un ambiente 
asincrono, il che ci ha permesso di arrivare al 2014. Ovvero: vuoi usare 
django in maniera asincrona? Prova a farlo con yield... Vuoi usare 
SQLAlchemy? Uhmm, ritenta, sarai più fortunato. Ho conosciuto comuni 
mortali che avevano bisogno di queste cose (twisted tendevano a usarlo 
i semidei e altri impiegati olimpici). Il futuro è quello? Non c'è 
problema per me. Ma `questo http://python.org/dev/peps/pep-0249/`__ va 
riscritto, come tutti i programmi che ci sono progettati ed implementati 
sopra, e non so se tu ci avevi pensato. La mia non era una nota polemica 
come hai letto tu: le interfacce sono state rotte: vanno riprogettate e 
i programmi dovranno essere riscritti; questo è un dato di fatto.




Unyielding - Deciphering Glyph
https://glyph.twistedmatrix.com/2014/02/unyielding.html

Che è poi il motivo per cui ho usato Twisted per anni, apprezzo
Tornado (e Go), e non mi vedrete tanto presto a usare gevent, 
eventlet

e compagnia, per non dire mai.


È fico essere duri e puri. Io invece mi sono trovato nella posizione di 
scrivere software che altri devono usare: a volte nella maniera in cui 
lo userei anche io, a volte no. Sono sicuro che il supporto a librerie 
di coroutine abbia aiutato più di qualche persona, e questo mi fa 
piacere nonostante ci siano sempre gli odiatori di professione 
(gironzolare su twitter per cercare feedback sul proprio lavoro è come 
andare sulle montagne russe).



-- Daniele

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Manlio Perillo
2014-03-14 23:33 GMT+01:00 Balan Victor balan.vict...@gmail.com:

 Il giorno 14 marzo 2014 18:12, Manlio Perillo manlio.peri...@gmail.comha 
 scritto:




 2014-03-13 19:35 GMT+01:00 Balan Victor balan.vict...@gmail.com:

 Di recente ho letto un po di tornado, e in particolare mi sono soffermato
 sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
 che c'è scritto sulla documentazione ufficiale parla di non-blocking,
 single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
 sembra interessante, anche se non ho la minima idea di come funzioni.

  [...]

 L'argomento è complesso.

 hai da consigliare qualche post/documento/libero che spiega bene
 l'argomento?(Italiano/Inglese) ? Su google ne ho trovato alcuni ma  non
 sono il massimo della chiarezza


Purtroppo no.


  Nel caso di un server C10K ready ci sono due aspetti principali.
 Il primo riguarda tutto quel codice che esegue una richiesta ed aspetta
 una risposta.
 Il secondo riguarda il paradigma utilizzato per gestire il flusso del
 codice.

 Il 97.7% delle librerie disponibili fa qualcosa del tipo:

status = send_request(data)
resp = recv_response()

 Entrambe le funzioni potrebbero metterci molto tempo a completare, ma
 questo codice blocca l'intero thread fino a quando resp non è disponibile.

 Quello che fa tornado è di usare quelle che si chiamano coroutine, o
 threading cooperativo.
 In questo caso sia send_request che recv_response bloccano il flusso
 corrente del codice (la coroutine corrente), ma non l'intero thread perchè
 usando le coroutine viene effettuato un salto (simile al goto) che va ad
 eseguire altre funzioni coroutine.

 e se dentro recv_response ho una chiamata al db perché mi dovrebbe
 bloccare?


Se usi la libreria giusta non blocca.
Ad esempio la libpq ha un API scritta come si deve (una delle poche,
purtroppo, almeno per quello che so) e che permette di fare richieste
asincrone.

se sono eseguiti in coruotine la chiamata al db non dovrebbe andare a
 girare in qualche modo in background?


Come detto, devi usare la libreria giusta.
PostgreSQL usa libpq che offre un API asincrona, e psycopg usa questa API e
le coroutine per fornire una API semplice.  Vedi la documentazione


sa: gevent (l'implementazione delle coroutine) sembra risolva tutti i
 problemi, ma in realtà tutto quello che fa ha un costo.  Non è un caso che
 i web server C10K usano la programmazione tramite callback e macchina a
 stati; questo perchè è molto più efficiente nella gestione della memoria.
  Ogni coroutine è come un thread ed ha bisogno di memoria per lo stack,
 oltre poi al costo per il context switch.

E i multiprocessing?

Quello che fanno le implementazioni delle coroutine più avanzate, come GHC,
Erlang e Go è di reimplementare in user space quello che fa il kernel con i
processi, in modo più semplice (perchè il contesto associato ad un green
thread è più piccolo rispetto a quello associato ad un processo) ed
efficiente, oltre che più prevedibile.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Manlio Perillo
2014-03-15 0:54 GMT+01:00 Giampaolo Rodola' g.rod...@gmail.com:


 2014-03-14 18:12 GMT+01:00 Manlio Perillo manlio.peri...@gmail.com:

 Ogni coroutine è come un thread ed ha bisogno di memoria per lo stack,
 oltre poi al costo per il context switch.


 Rispetto ad un thread il costo è però pressochè nullo.


Roberto tempo fa ha scritto che ha visto applicazioni con gevent con
utilizzo pesante della CPU, nel caso di molte coroutine.

Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Roberto De Ioris

 2014-03-15 0:54 GMT+01:00 Giampaolo Rodola' g.rod...@gmail.com:


 2014-03-14 18:12 GMT+01:00 Manlio Perillo manlio.peri...@gmail.com:

 Ogni coroutine è come un thread ed ha bisogno di memoria per lo stack,
 oltre poi al costo per il context switch.


 Rispetto ad un thread il costo è però pressochè nullo.


 Roberto tempo fa ha scritto che ha visto applicazioni con gevent con
 utilizzo pesante della CPU, nel caso di molte coroutine.



purtroppo si, le greenlet hanno comunque uno stack e gevent comunque in
media chiama molte piu' syscall rispetto ad un uso classico (per svariati
motivi).

E' un prodotto/progetto che adoro, ma va' usato nei posti e nel modo giusto.

Oggi ho buttato giu' questo:

http://uwsgi-docs.readthedocs.org/en/latest/articles/OffloadingWebsocketsAndSSE.html

... bisogna farla finita di credere alla favola che django gira gratis
su gevent (tantomeno su tornado)...

Non c'e' niente da fare, il vantaggio di nodejs, Go ecc. ecc. e' che TUTTE
le librerie di terze parti sono non-blocking-friendly (passatemi il
termine) e quindi gli utenti (piu' o meno) non devono preoccuparsi di
nulla... questo non puo' avvenire (facilmente) con i linguaggi che sono
nati in un mondo multiprocess/multithread  e che gia' hanno una libreria
sconfinata di moduli di terze parti (costruita in decenni)..

In ogni caso il passaggio non potra' essere indolore (e gia' ci sono le
prime vittime, senza contare quelli che hanno proprio disertato cambiando
bandiera...)


-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Nicola Larosa

Roberto De Ioris wrote:

Non c'e' niente da fare, il vantaggio di nodejs, Go ecc. ecc. e'
che TUTTE le librerie di terze parti sono non-blocking-friendly
(passatemi il termine) e quindi gli utenti (piu' o meno) non devono
preoccuparsi di nulla...


No, questo per Go non è vero. Vedi la mia risposta a Manlio di stamattina.

--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Roberto De Ioris

 Roberto De Ioris wrote:
 Non c'e' niente da fare, il vantaggio di nodejs, Go ecc. ecc. e'
 che TUTTE le librerie di terze parti sono non-blocking-friendly
 (passatemi il termine) e quindi gli utenti (piu' o meno) non devono
 preoccuparsi di nulla...

 No, questo per Go non è vero. Vedi la mia risposta a Manlio di stamattina.



In che senso ? nella peggiore delle ipotesi Go fa' l'offloading su un
pthread, quindi comunque l'utente e' salvo.

O intendi altro ?


-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Nicola Larosa

Roberto De Ioris wrote:

Non c'e' niente da fare, il vantaggio di nodejs, Go ecc. ecc. e'
che TUTTE le librerie di terze parti sono non-blocking-friendly
(passatemi il termine) e quindi gli utenti (piu' o meno) non
devono preoccuparsi di nulla...



Nicola Larosa wrote:

No, questo per Go non è vero. Vedi la mia risposta a Manlio di
stamattina.



In che senso? nella peggiore delle ipotesi Go fa l'offloading su
un pthread, quindi comunque l'utente e' salvo.

O intendi altro ?


È vero che l'utente non deve preoccuparsi di nulla, ma non perché le
librerie siano tutte non bloccanti bensì perché, come dicevo, Go
consente di mischiare in modo trasparente codice sincrono e asincrono.

Credo che offloading su pthread corrisponda a quello che descrivevo
come mapping N-to-M delle goroutine ai thread di sistema. Giusto?

--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Roberto De Ioris

 Roberto De Ioris wrote:
 Non c'e' niente da fare, il vantaggio di nodejs, Go ecc. ecc. e'
 che TUTTE le librerie di terze parti sono non-blocking-friendly
 (passatemi il termine) e quindi gli utenti (piu' o meno) non
 devono preoccuparsi di nulla...

 Nicola Larosa wrote:
 No, questo per Go non è vero. Vedi la mia risposta a Manlio di
 stamattina.

 In che senso? nella peggiore delle ipotesi Go fa l'offloading su
 un pthread, quindi comunque l'utente e' salvo.

 O intendi altro ?

 È vero che l'utente non deve preoccuparsi di nulla, ma non perché le
 librerie siano tutte non bloccanti bensì perché, come dicevo, Go
 consente di mischiare in modo trasparente codice sincrono e asincrono.

ah ok giustissimo, ma calcola anche che praticamente tutta la standard
library di Go e' non-bloccante, il che lo mette in posizione di vantaggio
(e anche di tanto) rispetto a python (o a perl o a ruby)

anche se gli ultimi progetti che ho rilasciato sono in go, ancora non mi
sono innamorato, ma sarei ingiusto a dire che non e' fantastico nella
maggior parte delle cose che fa...


 Credo che offloading su pthread corrisponda a quello che descrivevo
 come mapping N-to-M delle goroutine ai thread di sistema. Giusto?


si esatto, anche la nomenclatura che usano e' piu' fica di quella degli
altri :)


-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Daniele Varrazzo

On 2014-03-15 18:08, Roberto De Ioris wrote:


Oggi ho buttato giu' questo:


http://uwsgi-docs.readthedocs.org/en/latest/articles/OffloadingWebsocketsAndSSE.html


Grazie, me lo rileggo domani con un tasso di sangue nell'alcol più 
alto. Ma, domanda veloce:



This is the whole point of this article: do not use the Django ORM in 
your gevent apps
unless you know what you are doing !!! (read, you have a django 
database adapter that

supports gevent and does not sucks compared to the standard ones...)


Con questo dici:

1. impossibile usare django+gevent+psycopg2 in maniera realmente non 
blocking
2. gevent+psycopg2 funzionerebbe se avesse un wrapper django 
diverso/migliore

3. django+gevent+psycopg2 funzionano, altri driver/database no
4. vai a letto piro, non c'hai capito niente ed è tardi

Grazie ancora :)

-- Daniele

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-15 Per discussione Roberto De Ioris

 On 2014-03-15 18:08, Roberto De Ioris wrote:

 Oggi ho buttato giu' questo:


 http://uwsgi-docs.readthedocs.org/en/latest/articles/OffloadingWebsocketsAndSSE.html

 Grazie, me lo rileggo domani con un tasso di sangue nell'alcol più
 alto. Ma, domanda veloce:

 
 This is the whole point of this article: do not use the Django ORM in
 your gevent apps
 unless you know what you are doing !!! (read, you have a django
 database adapter that
 supports gevent and does not sucks compared to the standard ones...)
 

 Con questo dici:

 1. impossibile usare django+gevent+psycopg2 in maniera realmente non
 blocking
 2. gevent+psycopg2 funzionerebbe se avesse un wrapper django
 diverso/migliore
 3. django+gevent+psycopg2 funzionano, altri driver/database no
 4. vai a letto piro, non c'hai capito niente ed è tardi

 Grazie ancora :)



Nessuna di queste :) ci sono adapter che hanno funzionato (notare il
passato), altri che funzionano il 90% delle volte e cosi' via. Il mio
obiettivo e' insinuare il dubbio, perche' se usi queste tecnologie devi
porti delle domande, e non solo sui db, su ogni punto della tua
applicazione.

Mi rendo conto che non e' un approccio molto tecnico, ma francamente
sentirmi dire che cazzo dici !!! ho letto sul blog di topogigio che si
puo' fare e senza sforzo, beh un pochino mi rode...

Ad esempio la funzione di entropia di openssl e' ultra-bloccante, e guarda
un po' l'ho vista usata in un app django-gevent...

(comunque, questo, basato su psycogreen, funziona molto bene:
https://github.com/jneight/django-db-geventpool)

Dei tutorial (quelli diciamo piu' famosi), che ci sono su django + gevent,
solo uno riporta psycogreen, gli altri glissano o consigliano di usare
adapter pure-python (che sono spesso lontani dall'essere full-featured)



-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Roberto De Ioris

 Di recente ho letto un po di tornado, e in particolare mi sono soffermato
 sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
 che c'è scritto sulla documentazione ufficiale parla di non-blocking,
 single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
 sembra interessante, anche se non ho la minima idea di come funzioni. Sono
 rimasto perplesso quando ho provato a cercare qualche ORM da usare con
 tornado e non ho trovato nulla. Dopo un po di ricerche, da quello che ho
 capito, un orm non è fatto per lavorare in maniera asincrona. E non ho
 neppure trovato una libreria per collegarsi a qualche tipo di database
 relazione(a parte quella con MySql ma sembra non più supportata).

 Detto questo, non riesco a capire l'utilità di un HTTP Server con
 performance elevatissime ma che non permetta una minima interazione con il
 database.

 Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
 le basi per questo tipo di argomenti e volevo capire meglio come
 funzionano
 e quali sono i campi di applicazione di tecnologie simili.



Non hai scritto cavolate, e anzi ti faccio i complimenti perche'
nonostante dichiari di non capire bene la materia in realta' ti sei
accorto del (secondo me) problema piu' grosso di tutte le tecnologie
non-blocking nel mondo python: sono vendute MALISSIMO, in modo quasi
dannoso.

Il paradigma non-blocking ha una semplice regola: o sei non-blocking al
100% oppure la tua app non funziona. punto. il 99.999% non e'
sufficiente. Una singola parte non bloccante ti manda l'app in malora.
(ovvio, si potrebbero non avere problemi per mesi, ma all'improvviso una
query resta bloccata e tutta l'app va giu'...)

Ad oggi ho fatto consulenza su quasi 200 app Django che giravano su
uWSGI+gevent o gunicorn+gevent. Di queste neanche il 10% erano corrette in
quanto la maggior parte usavano i db adapter standard, o si collegavano a
servizi esterni (come api http) usando moduli blocking e cosi' via.

Parliamo di quasi il 90% di utenti che stanno usando una tecnologia in
modo sbagliato e che continuano a pubblicizzare il loro successo con
gevent.

La stessa cosa succede con tornado, eventlet e sono sicuro che succedera'
con asyncio/tulip

Uno dei punti di forza di python (secondo me) e' la gigantesca
disponibilita' di moduli, e un utente medio si aspetta di poter continuare
a usarli tutti senza problemi, soprattutto se NON gli comunichi a
caratteri cubitali tutte le implicazioni del non-blocking (e invece gli
porti solo i vantaggi)

Detto questo, ci sono comunque diversi moduli
async-friendly/tornado-friendly ma sono spesso progettini, a volte
sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
essere adattato al non-blocking)

In conclusione, se sei fortunato troverai un adapter per il tuo db che
funziona con tornado, ma dovrai tenere a mente che ogni volta che
introduci una funzionalita' questa dovra' cooperare con il resto del
sistema.


-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Balan Victor

 Uno dei punti di forza di python (secondo me) e' la gigantesca

disponibilita' di moduli, e un utente medio si aspetta di poter continuare
 a usarli tutti senza problemi, soprattutto se NON gli comunichi a
 caratteri cubitali tutte le implicazioni del non-blocking (e invece gli
 porti solo i vantaggi

ecco, io rientro nella categoria utente medio XD un po per colpa mia un po
perché non ho mai avuto la necessità del NON-BLOCKING e non mi ero
interessato della cosa.

 Detto questo, ci sono comunque diversi moduli

async-friendly/tornado-friendly ma sono spesso progettini, a volte
 sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
 il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
 essere adattato al non-blocking

per psycopg2 ho visto che esiste momoko(come sugerito da Dario) però mi
sono accorto che in realtà non ti risolve del tutto il problema perché alla
fine sei vincolato alla dimensione del connection pool.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Giampaolo Rodola'
2014-03-14 8:26 GMT+01:00 Roberto De Ioris robe...@unbit.it:

 Detto questo, ci sono comunque diversi moduli
 async-friendly/tornado-friendly ma sono spesso progettini, a volte
 sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
 il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
 essere adattato al non-blocking)


Mi interessa. In che modo?


-- 
Giampaolo - http://grodola.blogspot.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Balan Victor
Il giorno 14 marzo 2014 13:17, Giampaolo Rodola' g.rod...@gmail.com ha
scritto:


 2014-03-14 8:26 GMT+01:00 Roberto De Ioris robe...@unbit.it:

 Detto questo, ci sono comunque diversi moduli
 async-friendly/tornado-friendly ma sono spesso progettini, a volte
 sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
 il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
 essere adattato al non-blocking)


 Mi interessa. In che modo?

penso si riferisse a https://github.com/FSX/momoko
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Carlo Miron
Il 14 marzo 2014 13:35, Balan Victor balan.vict...@gmail.com ha scritto:

 Il giorno 14 marzo 2014 13:17, Giampaolo Rodola' g.rod...@gmail.com ha
 scritto:
 2014-03-14 8:26 GMT+01:00 Roberto De Ioris robe...@unbit.it:
 Detto questo, ci sono comunque diversi moduli
 async-friendly/tornado-friendly ma sono spesso progettini, a volte
 sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
 il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
 essere adattato al non-blocking)

 Mi interessa. In che modo?

 penso si riferisse a https://github.com/FSX/momoko

Io invece credo parlasse di
http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries

©

-- 
 :**THE BEER-WARE LICENSE** (Revision 42):
   ``miron AT python.it`` wrote this mail. As long as you retain this notice
   you can do whatever you want with this stuff. If we meet some day, and you
   think this stuff is worth it, you can buy me a beer in return.

   --*Carlo Miron*

  ..
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Valerio Maggio

On 14 Mar 2014, at 14:03, Carlo Miron mi...@python.it wrote:

 Io invece credo parlasse di
 http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries

+1 

Da cui, poi, si arriva a **psycogreen** : 
https://bitbucket.org/dvarrazzo/psycogreen/

--
valerio


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Daniele Varrazzo

On 2014-03-14 13:58, Roberto De Ioris wrote:
Il 14 marzo 2014 13:35, Balan Victor balan.vict...@gmail.com ha 
scritto:


Il giorno 14 marzo 2014 13:17, Giampaolo Rodola' 
g.rod...@gmail.com ha

scritto:

2014-03-14 8:26 GMT+01:00 Roberto De Ioris robe...@unbit.it:

Detto questo, ci sono comunque diversi moduli
async-friendly/tornado-friendly ma sono spesso progettini, a 
volte

sviluppati senza l'attenzione necessaria ad un modulo db-adapter
(vedere
il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca 
puo'

essere adattato al non-blocking)


Mi interessa. In che modo?


penso si riferisse a https://github.com/FSX/momoko


Io invece credo parlasse di

http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries


esatto, proprio questo


Tra l'altro un mio collega mi ha portato all'attenzione un progetto di 
integrazione tra psycopg e tulip che però non è un gran che. Purtroppo 
tulip non si integra bene con il supporto green di psycopg, perché è 
basato su yield, quindi invece di una wait_callback come per 
eventlet/gevent/uWsgi ci vorrà un wrapper che utilizzi psycopg in 
maniera async (non green) ed offra un'interfaccia simil-dbapi ma non 
bloccante e con tutti gli yeldini al posto loro.


-- Daniele

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Balan Victor
Il giorno 14 marzo 2014 18:12, Manlio Perillo manlio.peri...@gmail.com ha
scritto:




 2014-03-13 19:35 GMT+01:00 Balan Victor balan.vict...@gmail.com:

 Di recente ho letto un po di tornado, e in particolare mi sono soffermato
 sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
 che c'è scritto sulla documentazione ufficiale parla di non-blocking,
 single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
 sembra interessante, anche se non ho la minima idea di come funzioni.

  [...]

 Detto questo, non riesco a capire l'utilità di un HTTP Server con
 performance elevatissime ma che non permetta una minima interazione con il
 database.

 Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
 le basi per questo tipo di argomenti e volevo capire meglio come funzionano
 e quali sono i campi di applicazione di tecnologie simili.


 L'argomento è complesso.

hai da consigliare qualche post/documento/libero che spiega bene
l'argomento?(Italiano/Inglese) ? Su google ne ho trovato alcuni ma  non
sono il massimo della chiarezza

Nel caso di un server C10K ready ci sono due aspetti principali.
 Il primo riguarda tutto quel codice che esegue una richiesta ed aspetta
 una risposta.
 Il secondo riguarda il paradigma utilizzato per gestire il flusso del
 codice.

 Il 97.7% delle librerie disponibili fa qualcosa del tipo:

status = send_request(data)
resp = recv_response()

 Entrambe le funzioni potrebbero metterci molto tempo a completare, ma
 questo codice blocca l'intero thread fino a quando resp non è disponibile.

 Quello che fa tornado è di usare quelle che si chiamano coroutine, o
 threading cooperativo.
 In questo caso sia send_request che recv_response bloccano il flusso
 corrente del codice (la coroutine corrente), ma non l'intero thread perchè
 usando le coroutine viene effettuato un salto (simile al goto) che va ad
 eseguire altre funzioni coroutine.

e se dentro recv_response ho una chiamata al db perché mi dovrebbe
bloccare? se sono eseguiti in coruotine la chiamata al db non dovrebbe
andare a girare in qualche modo in background?


 Senza le coroutine, quello che si fa è usare le callback ed una macchina a
 stati (lo stato deve essere gestito manualmente perchè non hai lo stack
 disponibile nel codice normale).

 L'esempio di prima diventa:

def do_request(data, ctx):
send_request(data, on_request_done, ctx)
   
def on_request_done(status, ctx):
 recv_response(on_response_done, ctx)
   
def on_response_done(resp, ctx):
# DONE

 Come vedi diventa molto complicato, specialmente se ad esempio devi fare
 il parsing di un protocollo come HTTP (puoi vedere il codice di Twisted se
 ti interessa).

 Tra l'altro il motivo perchè tornado va di moda è perchè permette di avere
 il codice che è praticamente lo stesso di quello normale, ma che si
 comporta in modo completamente diverso.  Twisted offre un framework per la
 programmazione asincrona da anni, ma non è mai stato di moda, perchè molto
 più difficile.

Prima di arrivare a tornado sono passato da Twisted ma non mi sono
soffermato troppo perché molto più difficile


 Considerato tutti i problemi che gli utenti hanno con tornado e friends (e
 che nemmeno sanno di sapere), direi che, come sempre, explicit is better
 than implicit.

 Il mio suggerimento è sempre quello di imparare prima le basi (vicino a
 quello che realmente succede) e solo dopo utilizzare cose che rendono la
 programmazione e manutenzione più semplice.

 Come ultima cosa: gevent (l'implementazione delle coroutine) sembra
 risolva tutti i problemi, ma in realtà tutto quello che fa ha un costo.
  Non è un caso che i web server C10K usano la programmazione tramite
 callback e macchina a stati; questo perchè è molto più efficiente nella
 gestione della memoria.  Ogni coroutine è come un thread ed ha bisogno di
 memoria per lo stack, oltre poi al costo per il context switch.

E i multiprocessing?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Giampaolo Rodola'
2014-03-14 18:12 GMT+01:00 Manlio Perillo manlio.peri...@gmail.com:

 Ogni coroutine è come un thread ed ha bisogno di memoria per lo stack,
 oltre poi al costo per il context switch.


Rispetto ad un thread il costo è però pressochè nullo.
Se non hai parti bloccanti che non riesci a rendere asincrone è di fatto
l'approccio più performante e scalabile che puoi adottare.

-- 
Giampaolo - http://grodola.blogspot.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Giampaolo Rodola'
2014-03-13 19:35 GMT+01:00 Balan Victor balan.vict...@gmail.com:

 Di recente ho letto un po di tornado, e in particolare mi sono soffermato
 sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
 che c'è scritto sulla documentazione ufficiale parla di non-blocking,
 single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
 sembra interessante, anche se non ho la minima idea di come funzioni. Sono
 rimasto perplesso quando ho provato a cercare qualche ORM da usare con
 tornado e non ho trovato nulla. Dopo un po di ricerche, da quello che ho
 capito, un orm non è fatto per lavorare in maniera asincrona. E non ho
 neppure trovato una libreria per collegarsi a qualche tipo di database
 relazione(a parte quella con MySql ma sembra non più supportata).

 Detto questo, non riesco a capire l'utilità di un HTTP Server con
 performance elevatissime ma che non permetta una minima interazione con il
 database.

 Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
 le basi per questo tipo di argomenti e volevo capire meglio come funzionano
 e quali sono i campi di applicazione di tecnologie simili.

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python


Hai intravisto giusto a la domanda non è per niente stupida.
I server asincroni performano e scalano enormemente meglio delle
controparti basate su processi/thread multipli (un esempio lampante è
pyftpdlib: https://code.google.com/p/pyftpdlib/wiki/Benchmarks - si guardi
sopratutto l'utilizzo di memoria) a patto che, appunto, tu non blocchi.

Quando arrivi al punto in cui sei costretto a bloccare (es: non hai uno
strato apposito che interagisce col db in maniera asincrona) hai una sola
possibilità: usare un thread (o un sottoprocesso).
Fare questo significa essenzialmente ripassare la palla all'IO loop e
quando il thread ha terminato prendere il risultato della funzione e
processarlo.

Fare questo a mano in maniera sana non è semplice, ed è infatti per
questo che solitamente i framework ti mettono a disposizione interfacce
apposite.
Nel caso specifico di Tulip/asyncio il codice dovrebbe essere una cosa di
questo tipo:

from tulip import tasks, coroutine

@coroutine
def foo():
fut = self.run_in_executor(long_running_db_call)
yield from tasks.wait(fut)
ret = fut.result()

La magia nel codice sopra sta nello yield from che letteralmente si legge
come lancia  long_running_db_call in un thread, vai a fare altro e ritorna
qui quando il thread è terminato.

Con Twisted l'approccio è diverso in quanto anzichè le coroutines utilizzi
le callback ma il concetto che sta alla base è il medesimo (lancia il
thread, vai a fare altro e processa il risultato del thread quando ha
terminato):
https://twistedmatrix.com/documents/12.2.0/core/howto/threading.html

Con Tornado casualmente non ho mai avuto a che fare con parti bloccanti
ma dando un'occhiata qui pare sia possibile in maniera analoga a
tulip/asyncio:
http://www.tornadoweb.org/en/stable/concurrent.html

L'unico caso in cui non sceglierei l'asincrono è dove TUTTE le tue
richieste sono bloccanti per un motivo o per un altro, nel qual caso
avresti prestazioni/scalabilità uguali o minori (più probabile) rispetto a
soluzioni nate espressamente per  utilizzare il modello di concorrenza
classico (thread / multi processi, esempio classico: django + gunicorn).

-- 
Giampaolo - http://grodola.blogspot.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-14 Per discussione Nicola Larosa

Daniele Varrazzo wrote:

Purtroppo tulip non si integra bene con il supporto green di psycopg,
perché è basato su yield


Chissà come mai Guido ci tiene tanto a questa seccatura dello yield...



con tutti gli yeldini al posto loro.


E non solo lui, a quanto pare. Ecco ben spiegata la prospettiva di noi 
comuni mortali che bizzarramente ci teniamo così tanto ad avere tutti 
gli yeldini al posto loro.


Unyielding - Deciphering Glyph
https://glyph.twistedmatrix.com/2014/02/unyielding.html

Che è poi il motivo per cui ho usato Twisted per anni, apprezzo Tornado 
(e Go), e non mi vedrete tanto presto a usare gevent, eventlet e 
compagnia, per non dire mai.


--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Balan Victor
Di recente ho letto un po di tornado, e in particolare mi sono soffermato
sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
che c'è scritto sulla documentazione ufficiale parla di non-blocking,
single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
sembra interessante, anche se non ho la minima idea di come funzioni. Sono
rimasto perplesso quando ho provato a cercare qualche ORM da usare con
tornado e non ho trovato nulla. Dopo un po di ricerche, da quello che ho
capito, un orm non è fatto per lavorare in maniera asincrona. E non ho
neppure trovato una libreria per collegarsi a qualche tipo di database
relazione(a parte quella con MySql ma sembra non più supportata).

Detto questo, non riesco a capire l'utilità di un HTTP Server con
performance elevatissime ma che non permetta una minima interazione con il
database.

Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
le basi per questo tipo di argomenti e volevo capire meglio come funzionano
e quali sono i campi di applicazione di tecnologie simili.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Francesco Pischedda
Forse questa discussione può aiutarti
http://stackoverflow.com/questions/3638844/is-tornado-really-non-blocking


Il giorno 13 marzo 2014 19:35, Balan Victor balan.vict...@gmail.com ha
scritto:

 Di recente ho letto un po di tornado, e in particolare mi sono soffermato
 sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
 che c'è scritto sulla documentazione ufficiale parla di non-blocking,
 single-threaded HTTP server e di risolvere il problemi di tipo C10K. Qua
 sembra interessante, anche se non ho la minima idea di come funzioni. Sono
 rimasto perplesso quando ho provato a cercare qualche ORM da usare con
 tornado e non ho trovato nulla. Dopo un po di ricerche, da quello che ho
 capito, un orm non è fatto per lavorare in maniera asincrona. E non ho
 neppure trovato una libreria per collegarsi a qualche tipo di database
 relazione(a parte quella con MySql ma sembra non più supportata).

 Detto questo, non riesco a capire l'utilità di un HTTP Server con
 performance elevatissime ma che non permetta una minima interazione con il
 database.

 Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
 le basi per questo tipo di argomenti e volevo capire meglio come funzionano
 e quali sono i campi di applicazione di tecnologie simili.

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python




-- 
Shipping is a feature. A really important feature. Your product must have
it.

Rendete ogni cosa il più semplice possibile, ma non di più (Albert
Einstein)

You are what you choose today, not what you've chosen before

Unix IS user friendly. It's just selective about who its friend are
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Balan Victor
Il giorno 13 marzo 2014 19:40, Francesco Pischedda 
francesco.pische...@gmail.com ha scritto:

 Forse questa discussione può aiutarti
 http://stackoverflow.com/questions/3638844/is-tornado-really-non-blocking



avevo già visto questa discussione però più che chiarirmi mi ha confermando
che l'interazione con il db porta a bloccare tutte le altre connessioni.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Balan Victor
Il giorno 13 marzo 2014 20:41, Balan Victor balan.vict...@gmail.com ha
scritto:




 Il giorno 13 marzo 2014 19:40, Francesco Pischedda 
 francesco.pische...@gmail.com ha scritto:

 Forse questa discussione può aiutarti
 http://stackoverflow.com/questions/3638844/is-tornado-really-non-blocking




 avevo già visto questa discussione però più che chiarirmi mi ha
 confermando che l'interazione con il db porta a bloccare tutte le altre
 connessioni.



quello che non capisco è a che pro avere un server che gestisce 10k di
connessioni se poi non puoi creare una pagina dinamica? per servire solo
delle pagine statiche?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Francesco Pischedda
in che senso non puoi creare una pagina dinamica? cosa te lo impedisce?


Il giorno 13 marzo 2014 20:46, Balan Victor balan.vict...@gmail.com ha
scritto:

 Il giorno 13 marzo 2014 20:41, Balan Victor balan.vict...@gmail.com ha
 scritto:




 Il giorno 13 marzo 2014 19:40, Francesco Pischedda 
 francesco.pische...@gmail.com ha scritto:

 Forse questa discussione può aiutarti
 http://stackoverflow.com/questions/3638844/is-tornado-really-non-blocking




 avevo già visto questa discussione però più che chiarirmi mi ha
 confermando che l'interazione con il db porta a bloccare tutte le altre
 connessioni.



 quello che non capisco è a che pro avere un server che gestisce 10k di
 connessioni se poi non puoi creare una pagina dinamica? per servire solo
 delle pagine statiche?

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python




-- 
Shipping is a feature. A really important feature. Your product must have
it.

Rendete ogni cosa il più semplice possibile, ma non di più (Albert
Einstein)

You are what you choose today, not what you've chosen before

Unix IS user friendly. It's just selective about who its friend are
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Diego Barrera

On 13/03/2014 20:55, Francesco Pischedda wrote:

cosa te lo impedisce?

di quotare bene?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Dario Vinella
Il giorno 13 marzo 2014 19:35, Balan Victor balan.vict...@gmail.com ha
scritto:

 E non ho neppure trovato una libreria per collegarsi a qualche tipo di
 database relazione



Per postgres c'è momoko ( http://momoko.61924.nl/en/latest/index.html ) che
wrappa psycopg2
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-13 Per discussione Balan Victor
Il giorno 13 marzo 2014 20:55, Francesco Pischedda 
francesco.pische...@gmail.com ha scritto:

 in che senso non puoi creare una pagina dinamica? cosa te lo impedisce?

Da dove carico i dati se non dal DB?

Per postgres c'è momoko ( http://momoko.61924.nl/en/latest/index.html ) che
 wrappa psycopg2

lo sto guardando adesso
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python