$30 off During Our Annual Pro Sale. View Details »

asyncio + aiohttp で作るウェブサービス / How to develop a web service with asyncio and aiohttp

Pine Mizune
September 18, 2018

asyncio + aiohttp で作るウェブサービス / How to develop a web service with asyncio and aiohttp

PyCon JP 2018 で発表した資料です。

『 asyncio + aiohttp で作るウェブサービス 』
https://pycon.jp/2018/event/sessions

---

This is the material I presented at PyConJP 2018.

"How to develop a web service with asyncio and aiohttp"
https://pycon.jp/2018/event/sessions

Pine Mizune

September 18, 2018
Tweet

More Decks by Pine Mizune

Other Decks in Programming

Transcript

  1. 1Z$PO +1 4FQ
    1JOF.J[VOF
    ʰ BTZODJP BJPIUUQ ʱͰ࡞Δɺ΢ΣϒαʔϏε
    )PXUPEFWFMPQBXFCTFSWJDFXJUIBTZODJP BOEBJPIUUQ

    View Slide



  2. "CPVUNF
    8IBUJTBTZODJP
    )PXUPVTFBJPIUUQ

    View Slide

  3. "CPVU NF
    QJOF
    QJOF
    8FCNPCJMFBQQFOHJOFFSJO5PLZP
    IUUQTFNPKJHFOOJOKB
    &NPKJ(FOFSBUPSUPPMGPS4MBDL BCPVU ."6

    XSJUUFOCZ1ZUIPOBJPIUUQ

    View Slide

  4. &NPKJ (FOFSBUPS
    MPWFT 1ZUIPO
    *NBHFQSPDFTTJOH
    "QQMJDBUJPOTFSWFS
    %FW0QT

    View Slide

  5. B
    BTZODJP

    View Slide

  6. 8IBU JTBTZODJP
    § "TZODISPOVT *0 FWFOUMPPQ BOEDPSPVUJOFT
    § TJOHMFUISFBEFE
    § MJLF+BWB4DSJQU &4
    PS3VCZ`T'JCFS
    § 5IFTUBOEBSEMJCSBSZ 1ZUIPO

    § BTZOD BXBJU LFZXPSET 1ZUIPO

    § )JHIQFSGPSNBODFBOEMJHIUXFJHIU
    § TVJUBCMFGPS*0CPVOEQSPDFTTJOH !

    View Slide

  7. &WFOU MPPQ
    § 3VOEFGBVMUFWFOUMPPQ
    import asyncio
    loop = asyncio.get_event_loop()
    loop.run_forever()
    § 6TFPUIFSFWFOUMPPQ MJCVW CBDLFOE

    import asyncio
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

    View Slide

  8. &WFOU MPPQ
    § 3VOEFGBVMUFWFOUMPPQ
    import asyncio
    loop = asyncio.get_event_loop()
    loop.run_forever()
    § 6TFPUIFSFWFOUMPPQ MJCVW CBDLFOE

    import asyncio
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
    4UBSUEFGBVMUFWFOUMPPQGPSFWFS

    View Slide

  9. &WFOU MPPQ
    § 3VOEFGBVMUFWFOUMPPQ
    import asyncio
    loop = asyncio.get_event_loop()
    loop.run_forever()
    § 6TFPUIFSFWFOUMPPQ MJCVW CBDLFOE

    import asyncio
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
    $IBOHFFWFOUMPPQQPMJDZ

    View Slide

  10. $PSPVUJOFT
    § &BTZUPVTFDPSPVUJOFT
    import asyncio
    async def run():
    await asyncio.sleep(1)
    coroutine = run()
    print(coroutine)
    #=>
    loop = asyncio.get_event_loop()
    loop.run_until_complete(coroutine)

    View Slide

  11. $PSPVUJOFT
    § &BTZUPVTFDPSPVUJOFT
    import asyncio
    async def run():
    await asyncio.sleep(1)
    coroutine = run()
    print(coroutine)
    #=>
    loop = asyncio.get_event_loop()
    loop.run_until_complete(coroutine)
    6TFBABTZOD EFGATUBUFNFOU

    View Slide

  12. $PSPVUJOFT
    § &BTZUPVTFDPSPVUJOFT
    import asyncio
    async def run():
    await asyncio.sleep(1)
    coroutine = run()
    print(coroutine)
    #=>
    loop = asyncio.get_event_loop()
    loop.run_until_complete(coroutine)
    $BMMBDPSPVUJOFGVODUJPO

    View Slide

  13. $PSPVUJOFT
    § &BTZUPVTFDPSPVUJOFT
    import asyncio
    async def run():
    await asyncio.sleep(1)
    coroutine = run()
    print(coroutine)
    #=>
    loop = asyncio.get_event_loop()
    loop.run_until_complete(coroutine)
    8BJUVOUJMUIFDPSPVUJOFFOET

    View Slide

  14. 'VUVSFT
    § .BLF'VUVSF GSPNDPSPVUJOFT
    improt asyncio
    async def identity(value):
    return value
    future1 = asyncio.ensure_future(identity(1))
    future2 = asyncio.ensure_future(identity(2))
    future3 = asyncio.gather(future1, future2)
    loop = asyncio.get_event_loop()
    print(loop.run_until_complete(future3))
    #=> [1, 2]

    View Slide

  15. 'VUVSFT
    § .BLF'VUVSF GSPNDPSPVUJOFT
    improt asyncio
    async def identity(value):
    return value
    future1 = asyncio.ensure_future(identity(1))
    future2 = asyncio.ensure_future(identity(2))
    future3 = asyncio.gather(future1, future2)
    loop = asyncio.get_event_loop()
    print(loop.run_until_complete(future3))
    #=> [1, 2]
    1SPNJTF %FGGFSFE FUD

    View Slide

  16. 'VUVSFT
    § .BLF'VUVSF GSPNDPSPVUJOFT
    improt asyncio
    async def identity(value):
    return value
    future1 = asyncio.ensure_future(identity(1))
    future2 = asyncio.ensure_future(identity(2))
    future3 = asyncio.gather(future1, future2)
    loop = asyncio.get_event_loop()
    print(loop.run_until_complete(future3))
    #=> [1, 2]
    $PSPVUJOFT'VUVSFT

    View Slide

  17. 'VUVSFT
    § .BLF'VUVSF GSPNDPSPVUJOFT
    improt asyncio
    async def identity(value):
    return value
    future1 = asyncio.ensure_future(identity(1))
    future2 = asyncio.ensure_future(identity(2))
    future3 = asyncio.gather(future1, future2)
    loop = asyncio.get_event_loop()
    print(loop.run_until_complete(future3))
    #=> [1, 2]
    .BLFOFXGVUVSFGSPNUXPGVUVSFT

    View Slide

  18. 'VUVSFT
    § .BLF'VUVSF GSPNDPSPVUJOFT
    improt asyncio
    async def identity(value):
    return value
    future1 = asyncio.ensure_future(identity(1))
    future2 = asyncio.ensure_future(identity(2))
    future3 = asyncio.gather(future1, future2)
    loop = asyncio.get_event_loop()
    print(loop.run_until_complete(future3))
    #=> [1, 2]
    8BJUVOUJMUIF'VUVSFFOET

    View Slide

  19. B
    BJPIUUQ

    View Slide

  20. 8IBU JTBJPIUUQ
    § "TZODISPOPVT)551DMJFOUTFSWFSGSBNFXPSL
    § BTZODJP CBTFE
    § 1ZUIPOSFRVJSFE
    § 4FQ WSFMFBTFE
    § $VSSFOUMZW
    § 4VQQPSUT8FC4PDLFU 4FTTJPO $PPLJF FUD
    BJPMJCTBJPIUUQ

    View Slide

  21. )BOEMFST
    from aiohttp import web
    async def items(request):
    page = request.query.get(‘page’)
    items = await item_repository.filter(page)
    return web.json_response(result)
    app.router.add_get(‘/items’, items)
    § .7$XFCBQQGSBNFXPSL`T$POUSPMMFS
    § SFDFJWFSFRVFTU SFUVSOSFTQPOTF

    View Slide

  22. )BOEMFST
    from aiohttp import web
    async def items(request):
    page = request.query.get(‘page’)
    items = await item_repository.filter(page)
    return web.json_response(result)
    app.router.add_get(‘/items’, items)
    § .7$XFCBQQGSBNFXPSL`T$POUSPMMFS
    § SFDFJWFSFRVFTU SFUVSOSFTQPOTF
    "TZODISPOPVT%#BDDFTT

    View Slide

  23. )BOEMFST
    from aiohttp import web
    async def items(request):
    page = request.query.get(‘page’)
    items = await item_repository.filter(page)
    return web.json_response(result)
    app.router.add_get(‘/items’, items)
    § .7$XFCBQQGSBNFXPSL`T$POUSPMMFS
    § SFDFJWFSFRVFTU SFUVSOSFTQPOTF
    "EEBOFXSPVUFUPUIFEFGBVMU63-SPVUFS

    View Slide

  24. )BOEMFST
    from aiohttp import web
    routes = web.RouteTableDef()
    @routes.get(‘/items’)
    async def items(request):
    page = request.query.get(‘page’)
    items = await item_repository.filter(page)
    return web.json_response(result)
    § 4VQQPSU'MBTLMJLFSPVUJOHEFGJOJUJPOT

    View Slide

  25. .JEEMFXBSFT
    import htmlmin
    from aiohttp import web
    @web.middleware
    async def htmlmin_middleware(request, handler):
    response = await handler(request)
    if response.content_type == 'text/html':
    response.text = htmlmin.minify(response.text)
    return response
    app.middlewares.append(htmlmin_middleware())
    § )5.-NJOJGZNJEEMFXBSFTBNQMF

    View Slide

  26. .JEEMFXBSFT
    import htmlmin
    from aiohttp import web
    @web.middleware
    async def htmlmin_middleware(request, handler):
    response = await handler(request)
    if response.content_type == 'text/html':
    response.text = htmlmin.minify(response.text)
    return response
    app.middlewares.append(htmlmin_middleware())
    § )5.-NJOJGZNJEEMFXBSFTBNQMF
    *OKFDUBTZODISPOPVTNJEEMFXBSF

    View Slide

  27. 1SPEVDUJPO
    § V84(* JTOPUTVQQPSUFE!
    § OHJOY (VOJDPSO BSFSFDPNNFOEFECZP⒏DJBM
    § SVOTTFSWFSXJUIDVTUPNXPSLFS
    FOWJSPONFOUT
    $ gunicorn myapp:app --bind localhost:8080
    --worker-class aiohttp.GunicornWebWorker

    View Slide

  28. $PODMVTJPO
    B
    § BTZODJP JTBTZODISPOVT *0 FWFOUMPPQBOEDPSPVUJOFTMJCSBSZ
    § BJPIUUQ JTBTZODJP CBTFEXFCBQQGSBNFXPSL
    § BJPIUUQ JTTJNQMFBOEDBOCVJMEIJHIQFSGPSNBODFBQQ
    5IBOLZPV

    View Slide