<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2014-03-14 23:33 GMT+01:00 Balan Victor <span dir="ltr"><<a href="mailto:balan.victor0@gmail.com" target="_blank">balan.victor0@gmail.com</a>></span>:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Il giorno 14 marzo 2014 18:12, Manlio Perillo <span dir="ltr"><<a href="mailto:manlio.perillo@gmail.com" target="_blank">manlio.perillo@gmail.com</a>></span> ha scritto:<div>

<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2014-03-13 19:35 GMT+01:00 Balan Victor <span dir="ltr"><<a href="mailto:balan.victor0@gmail.com" target="_blank">balan.victor0@gmail.com</a>></span>:<div>


<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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.</div>



</blockquote></div><div>> [...]</div><div><div><br></div></div><div>L'argomento è complesso.</div></div></div></div></blockquote></div><div>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 </div>

<div>
<div><br></div></div></div></div></div></blockquote><div><br></div><div>Purtroppo no.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">

<div class="gmail_extra"><div class="gmail_quote"><div><div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">

<div>Nel caso di un server C10K ready ci sono due aspetti principali.</div>
<div>Il primo riguarda tutto quel codice che esegue una richiesta ed aspetta una risposta.</div>
<div>Il secondo riguarda il paradigma utilizzato per gestire il flusso del codice.</div><div><br></div><div>Il 97.7% delle librerie disponibili fa qualcosa del tipo:</div><div><br></div><div>  >>> status = send_request(data)</div>



<div>  >>> resp = recv_response()</div><div><br></div><div>Entrambe le funzioni potrebbero metterci molto tempo a completare, ma questo codice blocca l'intero thread fino a quando resp non è disponibile.</div>



<div><br></div><div>Quello che fa tornado è di usare quelle che si chiamano coroutine, o threading cooperativo.</div><div>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.</div>


</div></div></div></blockquote></div><div>e se dentro recv_response ho una chiamata al db perché mi dovrebbe bloccare?</div></div></div></div></blockquote><div><br></div><div>Se usi la libreria giusta non blocca.</div><div>
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.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div> se sono eseguiti in "coruotine" la chiamata al db non dovrebbe andare a girare in qualche modo in background?</div>
<div>
<div></div></div></div></div></div></blockquote><div><br></div><div>Come detto, devi usare la libreria giusta.</div><div>PostgreSQL usa libpq che offre un API asincrona, e psycopg usa questa API e le coroutine per fornire una API "semplice".  Vedi la documentazione</div>
<div> </div><div><br><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">
<div class="gmail_quote"><div>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.</div>


</div></div></div></blockquote></div><div>E i multiprocessing?</div></div><br></div><div class="gmail_extra">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".</div>
</div>
<div><br></div></div><div><br></div><div>Ciao  Manlio</div></div><br></div></div>