[Python] Julia (Was: Walks like Python. Runs like C).

Marco Paolini markopaolini a gmail.com
Ven 16 Gen 2015 09:50:29 CET


Il giorno 16 gennaio 2015 08:59, Marco Ippolito <ippolito.marco a gmail.com>
ha scritto:
>
> ok. come si usa in modo semplice il modello asyncrono in python?
> io, ammetto, non l'ho capito. se hai dei riferimenti precisi ed esempi
> per cui capire meglio, ti ringrazio
>
Asyncio è basato sui normali generator python: cioè delle specie di
"closures" che persistono il call stack e le variabili locali.

normalmente questi generator li usi iterandoci con un for loop:

def some_numbers():
  yield 1
  yield 2
  yield 3

generator = some_numbers()
# generator is "suspended"

for number in generator:
 # suspended again
 print(number)

immagina di avere tanti di questi generators: ognuno è come una specie di
thread per asyncio (chiamato task).
asyncio si occupa di "iterare" tutti i suoi task ed appena un generator si
sospende, asyncio ne itera un altro.

un generator asyncio deve obbligatoriamente usare le istruzioni "yield" e
"yield from" ogni volta che vuole cedere il controllo ad altri task.

asyncio contiene implementazioni per le normali funzionalità di IO (lettura
da file, lettura da socket, ecc) nella forma di generators python.

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)

def do_ping(addr):
  sock = yield from asyncio.connect_socket(addr)
  yield from sock.write(b'ciao')

task = do_ping()
asyncio.run_untli_complete(task)


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.

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

Spero sia di aiuto

Marco
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150116/ef7b63a1/attachment-0001.html>


Maggiori informazioni sulla lista Python