<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2014-03-15 7:42 GMT+01:00 Nicola Larosa <span dir="ltr"><<a href="mailto:nico@teknico.net" target="_blank">nico@teknico.net</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">Manlio Perillo wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> [...]</blockquote></div><div class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Twisted offre un framework per la programmazione asincrona da anni,<br>
ma non è mai stato di moda, perchè molto più difficile.<br>
</blockquote>
<br></div>
Non ha avuto grande successo per vari altri motivi: avanti sui suoi<br>
tempi, documentazione carente, e anche insistenza sulla sintassi a<br>
callback preferita alle inline callback.<div class=""><br></div></blockquote><div><br></div><div>Secondo me molto ha influito il fatto che non fosse compatibile con il resto del mondo Python. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Considerato tutti i problemi che gli utenti hanno con tornado e<br>
friends (e che nemmeno sanno di sapere), direi che, come sempre,<br>
"explicit is better than implicit".<br>
</blockquote>
<br></div>
Poco ma sicuro. Creare punti impliciti di cambio di contesto, come fanno<br>
gevent ed eventlet, e come fanno i thread preemptive, è ingestibile.<br>
<br></blockquote><div><br></div><div>Si, ma con gevent i punti di cambio di contesto sono "deterministici".</div><div>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)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=""><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Il mio suggerimento è sempre quello di imparare prima le basi (vicino<br>
a quello che realmente succede) e solo dopo utilizzare cose che<br>
rendono la programmazione e manutenzione più semplice.<br>
</blockquote>
<br></div>
Se con questo intendi passare per la sintassi a callback prima di usare<br>
la pseudo sincrona, non sono d'accordo.</blockquote><div><br></div><div>No, indendevo capire quello che succede "sotto il cofano", altrimento non ci si rende conto dei possibili problemi e/o come risolverli.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Non si tratta di basi, è<br>
semplicemente un modo diverso, molto meno leggibile, di scrivere codice<br>
asincrono.<br>
<br>
Ormai le Promises ci sono anche in Javascript, non ha senso insistere col<br>
vecchio modello. Però andare troppo oltre e rinunciare agli yield, che<br>
marcano i punti di cambio di contesto, significa andarsela a cercare.<br>
<br>
Glyph Lefkowitz, cioè Mr. Twisted, fa un'ottima panoramica delle opzioni<br>
disponibili, ed illustra bene i pericoli di usare una sintassi implicita:<br>
<br>
"1. Straight callbacks: Twisted’s IProtocol, JavaScript’s on<foo> idiom,<br>
where you give a callback to something which will call it later and then<br>
return control to something (usually a main loop) which will execute<br>
those callbacks,<br>
<br>
2. “Managed” callbacks, or Futures: Twisted’s Deferred, JavaScript’s<br>
Promises/A[+], E’s Promises, where you create a dedicated<br>
result-that-will-be-available-<u></u>in-the-future object and return it for the<br>
caller to add callbacks to,<br>
<br>
3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield from<br>
coroutines, C#’s async/await, where you have a syntactic feature that<br>
explicitly suspends the current routine,<br>
<br>
4. and finally, implicit coroutines: Java’s “green threads”, Twisted’s<br>
Corotwine, eventlet, gevent, where any function may switch the entire<br>
stack of the current thread of control by calling a function which<br>
suspends it.<br>
<br></blockquote><div><br></div><div>Go non ha una sintassi per sospendere esplicitamente una goroutine; quindi appartiene a 4) ?</div><div></div></div><br></div><div class="gmail_extra">> [...]</div><div class="gmail_extra">
<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Ciao   Manlio</div></div>