Slide 1

Slide 1 text

࠷଎ͷ"4(*8FCαʔόΛ ୳ͯ͠ Junya Fukuda はんなりPython Unagi.py / Python駿河

Slide 2

Slide 2 text

썡쎕썟썷쎣쎟 •෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ •GEEKLAB.NAGANO •࠷ۙϚΠϯΫϥϑτͰখֶੜ޲͚Youtube഑৴࢝ΊΔ •Effective Python ୈ̎൛ ΦϯϥΠϯಡॻձ ΍͍ͬͯ·͢ʂ ΪʔΫϥϘ௕໺

Slide 3

Slide 3 text

଎͍ͷ͸޷͖Ͱ͔͢ʁ

Slide 4

Slide 4 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍

Slide 5

Slide 5 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍ •Θ͔͍ͬͯ·͢ɻɻɻ

Slide 6

Slide 6 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ

Slide 7

Slide 7 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ΋͍Ζ͍ΖศརͳͷͰ͢ɻɻ

Slide 8

Slide 8 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ΋͍Ζ͍ΖศརͳͷͰ͢ɻɻ •ػցֶशͱ͔IoTɺσʔλ෼ੳɺϓϩάϥϛϯάڭҭͰ΋࢖͍΍͍͢͠ɻɻɻ

Slide 9

Slide 9 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͸஗͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ΋͍Ζ͍ΖศརͳͷͰ͢ɻɻ •ͪΐͬͱͰ΋଎͍WebαʔόΛ୳͠ʹߦ͜͏ͱࢥ͍·͢ɻ •FWॆ࣮ͯ͠Δ͠ɺػցֶशͱ͔IoTɺσʔλ෼ੳɺGUIͰ΋࢖͍΍͍͢͠ɻɻɻ

Slide 10

Slide 10 text

ͯ͞ɺԿ͔Λ୳͢ͱ͖ʹ͸ ΋ͪΖΜɺɺ

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Go΋ૣ͍͚Ͳɺnode΋Pythonͷjapronto΋ΉͬͪΌૣ͍ https://qiita.com/tkngue/items/62101788c0f384a5b12e

Slide 13

Slide 13 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Go΋ૣ͍͚Ͳɺnode΋Pythonͷjapronto΋ΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ͸ ͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e

Slide 14

Slide 14 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Go΋ૣ͍͚Ͳɺnode΋Pythonͷjapronto΋ΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ͸ ͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ japronto͕͜Μ͚ͩૣ͍ཧ༝͸த਎͸ ΄΅C/C++Ͱ ༷ʑͳ ࠷దԽΛ͔͚͍ͯΔͨΊͰ͢ɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e

Slide 15

Slide 15 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Go΋ૣ͍͚Ͳɺnode΋Pythonͷjapronto΋ΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ͸ ͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ japronto͕͜Μ͚ͩૣ͍ཧ༝͸த਎͸ ΄΅C/C++Ͱ ༷ʑͳ ࠷దԽΛ͔͚͍ͯΔͨΊͰ͢ɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e

Slide 16

Slide 16 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae

Slide 17

Slide 17 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae japronto >>> FastAPI > responder >>> Flask ~ Django

Slide 18

Slide 18 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae japronto >>> FastAPI > responder >>> Flask ~ Django

Slide 19

Slide 19 text

஌썺썽쎕썮썶"4(* •ASGI ؾʹͳͬͨΒΈͯΈ͍ͩ͘͞ https://www.youtube.com/watch?v=EwG5EWKu8nw ASGIʢඇಉظαʔόήʔτ΢ΣΠΠϯλʔϑΣʔεʣͷ֓ཁ (Junya Fukuda) [PyCon JP 2020]

Slide 20

Slide 20 text

ੑೳଌఆͷఆ൪ 5FDI&NQPXFSCFODI.BSLT ΛݟͯΈ·͠ΐ͏

Slide 21

Slide 21 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/

Slide 22

Slide 22 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/

Slide 23

Slide 23 text

ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/

Slide 24

Slide 24 text

ؙʑ쎅ੑೳଌఆ݁Ռ •Uvicorn͕଎͍Α͏Ͱ͢ •ͨͩASGIରԠͷαʔό͸…Uvicorn͔͠ͷ͍ͬͯ·ͤΜ

Slide 25

Slide 25 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI Web ServerͷҰཡ Daphne Mangum IUUQTHJUIVCDPNqPSJNPOENBODBBXFTPNFBTHJ

Slide 26

Slide 26 text

쎟썝쎛썦쏃쏉썗쏒஍఺ •UvicornͱHypercornͷੑೳൺֱ •FW͸΋ͪΖΜɺେਓؾFastAPIͰ

Slide 27

Slide 27 text

6WJDPSOͱ)ZQFSDPSOͰ ੑೳΛൺֱ

Slide 28

Slide 28 text

6WJDPSOͱ)ZQFSDPSOͰ ੑೳΛൺֱʢΏΔͬͱʣ

Slide 29

Slide 29 text

•࣮ߦ؀ڥ͸ϩʔΧϧϚγϯ •ࢦඪ͸ɺॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒʗ1ඵ͋ͨΓʹࡹ͚ΔϦΫΤετ਺ •ੑೳଌఆπʔϧͱͯ͠ɺab ίϚϯυΛ࢖༻͢Δ •؆୯ͳWebΞϓϦέʔγϣϯΛUvicorn/HypercornͰಈ͔͢ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •ϓϩτίϧ͸http/1.1ʢSͳ͠ʣ

Slide 30

Slide 30 text

αʔό Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •Uvicorn •Hypercorn 0.11.0 0.11.8

Slide 31

Slide 31 text

αʔό •Uvicorn •Hypercorn 0.11.0 0.11.8 Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 32

Slide 32 text

ϋʔυ΢ΣΞ؀ڥ •Macbook Pro •2.6 GHz 6ίΞ Intel Core i7 •ϝϞϦ 16GB 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 33

Slide 33 text

쎿썗쏚쎿쎮쏓쎅ॲཧ @app.get("/query") async def get_message(): return {"text": f"spam, egg, spam and spam!"}

Slide 34

Slide 34 text

ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 35

Slide 35 text

ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ਺ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 36

Slide 36 text

ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ਺ → ૣ͍ͱྑ͍ → ଟ͍ͱྑ͍ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 37

Slide 37 text

•ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 38

Slide 38 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 39

Slide 39 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ

Slide 40

Slide 40 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ Uvicorn Hypercorn

Slide 41

Slide 41 text

•ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ Uvicorn Hypercorn Uvicorn Hypercorn

Slide 42

Slide 42 text

6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

•Uvicorn ͸ ܰྔ 6WJDPSO쎅ಛ௃

Slide 46

Slide 46 text

6WDPSO쎅ಛ௃ •Uvicorn ͸ ܰྔ •Uvicorn ͸ uvloop ͱ͍͏ asyncio ͷߴ଎Խπʔϧ͕ೖ͍ͬͯΔ

Slide 47

Slide 47 text

6WDPSO쎅ಛ௃ •Uvicorn ͸ ܰྔ •Uvicorn ͸ uvloop ͱ͍͏ asyncio ͷߴ଎Խπʔϧ͕ೖ͍ͬͯΔ

Slide 48

Slide 48 text

6WDPSO쎅ಛ௃ •Uvicorn ͸ ܰྔ •Uvicorn ͸ uvloop ͱ͍͏ asyncio ͷߴ଎Խπʔϧ͕ೖ͍ͬͯΔ

Slide 49

Slide 49 text

6WDPSO쎅ಛ௃ •Uvicorn ͸ ܰྔ •Uvicorn ͸ uvloop ͱ͍͏ asyncio ͷߴ଎Խπʔϧ͕ೖ͍ͬͯΔ •Hypercorn Ͱ΋ uvloop Λ࢖͏͜ͱ͕Ͱ͖Δʂʂʂ IUUQTQHKPOFTHJUMBCJPIZQFSDPSO

Slide 50

Slide 50 text

)ZQFSDPSO썾VWMPPQ쎩࢖썝쎂쎆 import asyncio import uvloop from hypercorn.asyncio import serve from hypercorn.config import Config import main_fastapi as faster config = Config() config.bind = ["localhost:8080"] asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(serve(faster.app, config)) IUUQTQHKPOFTHJUMBCJPIZQFSDPSOIPX@UP@HVJEFTBQJ@VTBHFIUNM

Slide 51

Slide 51 text

)ZQFSDPSO썾VWMPPQ쎩࢖썝쎂쎆 import asyncio import uvloop from hypercorn.asyncio import serve from hypercorn.config import Config import main_fastapi as faster config = Config() config.bind = ["localhost:8080"] asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(serve(faster.app, config)) IUUQTQHKPOFTHJUMBCJPIZQFSDPSOIPX@UP@HVJEFTBQJ@VTBHFIUNM

Slide 52

Slide 52 text

•ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 53

Slide 53 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 54

Slide 54 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 55

Slide 55 text

ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 56

Slide 56 text

•ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 57

Slide 57 text

•ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ

Slide 58

Slide 58 text

•ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ Uvicorn Hypercorn Uvicorn Hypercorn Hypercorn - uvloop Hypercorn - uvloop

Slide 59

Slide 59 text

쎕썿쎘 •΍ͬͺΓUvicorn͸͸΍͍

Slide 60

Slide 60 text

쎕썿쎘 •΍ͬͺΓUvicorn͸͸΍͍ •଎͍ASGI Webαʔό͸UvicornͰྑͦ͞͏

Slide 61

Slide 61 text

쎕썿쎘 •΍ͬͺΓUvicorn͸͸΍͍ •଎͍ASGI Webαʔό͸UvicornͰྑͦ͞͏ •Ͱ͸ଞͷ͸͍Βͳ͍….ʁʁ

Slide 62

Slide 62 text

쎕썿쎘 •΍ͬͺΓUvicorn͸͸΍͍ •଎͍ASGI Webαʔό͸UvicornͰྑͦ͞͏ •Ͱ͸ଞͷ͸͍Βͳ͍….ʁʁ •Hypercorn͸੝Γͩ͘͞ΜͳWebαʔό

Slide 63

Slide 63 text

쎕썿쎘 •΍ͬͺΓUvicorn͸͸΍͍ •଎͍ASGI Webαʔό͸UvicornͰྑͦ͞͏ •Ͱ͸ଞͷ͸͍Βͳ͍….ʁʁ •Hypercorn͸੝Γͩ͘͞ΜͳWebαʔό •PyCon mini Hiroshima Ͱ͠Ό΂ͬͨͷͰڵຯ͕͋Ε͹͝ཡ͍ͩ͘͞ʂ IUUQTTQFBLFSEFDLDPNKSGLIUUQUPBTHJXFCTBCBGBMTFHVBOYJIZQFSDPSOXPMJOJ

Slide 64

Slide 64 text

ࢀߟࢿྉ •Hypercorn IUUQTQHKPOFTHJUMBCJPIZQFSDPSOJOEFYIUNM •jrfk / fastapi-hypercorn_Performance-measurement IUUQTHJUIVCDPNKSGLGBTUBQJIZQFSDPSO@1FSGPSNBODFNFBTVSFNFOU