Async, await

45
ASYNC, AWAIT asynchronous |eɪˈsɪŋkrənəs| (adj.) 異步的 Adrian Liaw

Transcript of Async, await

Page 1: Async, await

ASYNC, AWAITasynchronous |eɪˈsɪŋkrənəs| (adj.) 異步的

Adrian Liaw

Page 2: Async, await

廖偉涵 Adrian Liawadrianliaw / adrianliaw2000http://github.com/adrianliaw

Page 3: Async, await

AGENDAWhat is asyncTraditional approachasyncio

Page 4: Async, await
Page 5: Async, await

PSEUDOCODEwhile not everyone is done:

person = select 1st person in the queue

if not check_homework(person):

person.fill_blanks(do go_to_queue() when done)

Page 6: Async, await
Page 7: Async, await
Page 8: Async, await
Page 9: Async, await
Page 10: Async, await
Page 11: Async, await
Page 12: Async, await
Page 13: Async, await
Page 14: Async, await
Page 15: Async, await
Page 16: Async, await
Page 17: Async, await
Page 18: Async, await
Page 19: Async, await
Page 20: Async, await
Page 21: Async, await
Page 22: Async, await
Page 23: Async, await
Page 24: Async, await
Page 25: Async, await
Page 26: Async, await
Page 27: Async, await
Page 28: Async, await
Page 29: Async, await
Page 30: Async, await
Page 31: Async, await

WHAT IS ASYNCAsynchronous I/O or non-blocking I/OSingle-threaded

Non-blocking sockets

select, epoll, kqueue

event loop"Tell me when you're done"

Page 32: Async, await

TRADITIONAL APPROACH

Page 33: Async, await

CALLBACKSfs.readFile("foo", "utf8", function (error, result) { if (!error) console.log(error); else console.log(result)});

Page 34: Async, await
Page 35: Async, await

CONS OF CALLBACKMessyHard to save stateHard to organiseBad for Python

Page 36: Async, await

GENERATOR

Page 37: Async, await

>>> def foo():... yield "foo"... yield "bar"

>>> gen = foo()

>>> gen<generator object foo>

>>> next(gen)"foo">>> next(gen)"bar"

>>> next(gen)StopIteration:

Page 38: Async, await

>>> def foo():... bar = yield "foo"... baz = yield bar * 10

>>> gen = foo()>>> next(gen)'foo'>>> gen.send(20)200>>> gen.throw(ValueError)ValueError:

Page 39: Async, await

>>> def foo():... baz = yield from bar()... print(baz)

>>> def bar():... yield 1... yield 2... return "fooooo"

Page 40: Async, await

PEP 3156asyncio

Page 41: Async, await

@asyncio.coroutinedef coro_func(): print("Sleeping...") yield from asyncio.sleep(3) print("Done")

loop = asyncio.get_event_loop()loop.run_until_complete(coro_func())

Page 42: Async, await

async def coro_func(): print("Sleeping...") await asyncio.sleep(3) print("Done")

loop = asyncio.get_event_loop()loop.run_until_complete(coro_func())

Page 43: Async, await

asyncio + aiohttp = <3Fast Scraping In Python With Asyncio

Page 44: Async, await

REFERENCESPEP 3156bit.ly/coroutinesDavid Beazley - Python Concurrency From the Ground Up

Page 45: Async, await

Q&A