<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 16 gennaio 2015 08:59, Marco Ippolito <span dir="ltr"><<a href="mailto:ippolito.marco@gmail.com" target="_blank">ippolito.marco@gmail.com</a>></span> ha scritto:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ok. come si usa in modo semplice il modello asyncrono in python?<br>
io, ammetto, non l'ho capito. se hai dei riferimenti precisi ed esempi<br>
per cui capire meglio, ti ringrazio<br></blockquote><div>Asyncio è basato sui normali generator python: cioè delle specie di "closures" che persistono il call stack e le variabili locali.</div><div><br></div><div>normalmente questi generator li usi iterandoci con un for loop:</div><div><br></div><div>def some_numbers():</div><div> yield 1</div><div> yield 2</div><div> yield 3</div><div><br></div><div>generator = some_numbers()</div><div># generator is "suspended"</div><div><br></div><div>for number in generator:</div><div> # suspended again</div><div> print(number)</div><div><br></div><div>immagina di avere tanti di questi generators: ognuno è come una specie di thread per asyncio (chiamato task).<br></div><div>asyncio si occupa di "iterare" tutti i suoi task ed appena un generator si sospende, asyncio ne itera un altro.<br></div><div><br></div><div>un generator asyncio deve obbligatoriamente usare le istruzioni "yield" e "yield from" ogni volta che vuole cedere il controllo ad altri task.</div><div><br></div><div>asyncio contiene implementazioni per le normali funzionalità di IO (lettura da file, lettura da socket, ecc) nella forma di generators python.</div><div><br></div><div>ogni task asyncio che scrivi tu deve per forza usare queste nuove primitive ogni volta che fa IO per esempio qui sotto (scusa lo pseudocodice, i nomi delle funzioni sono inventati solo per rendere l'idea)</div><div><br></div><div>def do_ping(addr):</div><div> sock = yield from asyncio.connect_socket(addr)</div><div> yield from sock.write(b'ciao')</div><div><br></div><div>task = do_ping()</div><div>asyncio.run_untli_complete(task)</div><div><br></div><div><br></div><div>Per capire meglio come funziona ti consiglio di scrivere un task che fa 1 richiesta http usando iohttp e scrive la risposta su stdout, poi lo fai eseguire ad asyncio.</div><div><br></div><div>Alla fine i programmi asincroni asyncio sono di facile lettura (non servono i callback, sono chiari i punti di interruzione) e sono anche abbastanza performanti</div><div><br></div><div>Spero sia di aiuto</div><div><br></div><div>Marco</div></div></div></div>