Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
最速のASGIサーバを探して
Search
Junya Fukuda
October 17, 2020
0
190
最速のASGIサーバを探して
はんなりPython LT
Unagi.py / Python 駿河 LT
の資料です。
Junya Fukuda
October 17, 2020
Tweet
Share
More Decks by Junya Fukuda
See All by Junya Fukuda
ロボットでも使われるPython非同期 - trioって何!?
jrfk
0
99
タスクって今どうなってるの?3.14の新機能 asyncio ps と pstree でasyncioのデバッグを (PyCon JP 2025)
jrfk
2
770
プロダクションでのPython非同期ユースケース - Trio/Trio-Utilを中心に
jrfk
2
410
Event-Driven asyncio: A Case Study of Trio's API(PyCon US 2024)
jrfk
1
260
EuroPython 2023体験記 - 非英語話者の海外登壇@みんなのPython勉強会#98
jrfk
0
250
Asyncio Evolved: Enhanced Exception Handling with TaskGroup in Python 3.11(PyConTW 2023)
jrfk
0
99
Asyncio Evolved: Enhanced Exception Handling with TaskGroup in Python 3.11(EuroPython 2023)
jrfk
3
1.7k
Django 4.1のAsynchronous
jrfk
1
2.6k
New in Python 3.11: asyncio.TaskGroup and “Hello-ish World” of Asyncio
jrfk
0
530
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
94k
Speed Design
sergeychernyshev
33
1.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Accessibility Awareness
sabderemane
0
24
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
67
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Paper Plane (Part 1)
katiecoart
PRO
0
2.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
51
47k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
73
Transcript
࠷ͷ"4(*8FCαʔόΛ ୳ͯ͠ Junya Fukuda はんなりPython Unagi.py / Python駿河
썡쎕썟썷쎣쎟 •ా ൏ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾຊγεςϜٕݚʢJSLʣॴଐ ݝͷձࣾ •GEEKLAB.NAGANO •࠷ۙϚΠϯΫϥϑτͰখֶੜ͚Youtube৴࢝ΊΔ •Effective Python
ୈ̎൛ ΦϯϥΠϯಡॻձ ͍ͬͯ·͢ʂ ΪʔΫϥϘ
͍ͷ͖Ͱ͔͢ʁ
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍ •Θ͔͍ͬͯ·͢ɻɻɻ
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ͍Ζ͍ΖศརͳͷͰ͢ɻɻ
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ͍Ζ͍ΖศརͳͷͰ͢ɻɻ •ػցֶशͱ͔IoTɺσʔλੳɺϓϩάϥϛϯάڭҭͰ͍͍͢͠ɻɻɻ
쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •Python͍ •Θ͔͍ͬͯ·͢ɻɻɻ •Θ͔͍ͬͯ·͢ɻɻɻɻɻ •Ͱ͍Ζ͍ΖศརͳͷͰ͢ɻɻ •ͪΐͬͱͰ͍WebαʔόΛ୳͠ʹߦ͜͏ͱࢥ͍·͢ɻ •FWॆ࣮ͯ͠Δ͠ɺػցֶशͱ͔IoTɺσʔλੳɺGUIͰ͍͍͢͠ɻɻɻ
ͯ͞ɺԿ͔Λ୳͢ͱ͖ʹ ͪΖΜɺɺ
None
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Goૣ͍͚ͲɺnodePythonͷjaprontoΉͬͪΌૣ͍ https://qiita.com/tkngue/items/62101788c0f384a5b12e
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Goૣ͍͚ͲɺnodePythonͷjaprontoΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ
͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Goૣ͍͚ͲɺnodePythonͷjaprontoΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ
͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ japronto͕͜Μ͚ͩૣ͍ཧ༝த ΄΅C/C++Ͱ ༷ʑͳ ࠷దԽΛ͔͚͍ͯΔͨΊͰ͢ɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ Goૣ͍͚ͲɺnodePythonͷjaprontoΉͬͪΌૣ͍ python(japronto) v.s. nodejs v.s. golang Ͱ ൺֱͨ࣌͠ ͜ͷ3ͭ
͔ͳΓ͍͍উෛΛ͍ͯ͠·͢Ͷɻ japronto͕͜Μ͚ͩૣ͍ཧ༝த ΄΅C/C++Ͱ ༷ʑͳ ࠷దԽΛ͔͚͍ͯΔͨΊͰ͢ɻ https://qiita.com/tkngue/items/62101788c0f384a5b12e
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae japronto
>>> FastAPI > responder >>> Flask ~ Django
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ PythonͷWeb frameworkͷύϑΥʔϚϯεൺֱ (Django, Flask, responder, FastAPI, japronto) https://qiita.com/bee2/items/0ad260ab9835a2087dae japronto
>>> FastAPI > responder >>> Flask ~ Django
썺썽쎕썮썶"4(* •ASGI ؾʹͳͬͨΒΈͯΈ͍ͩ͘͞ https://www.youtube.com/watch?v=EwG5EWKu8nw ASGIʢඇಉظαʔόήʔτΣΠΠϯλʔϑΣʔεʣͷ֓ཁ (Junya Fukuda) [PyCon JP 2020]
ੑೳଌఆͷఆ൪ 5FDI&NQPXFSCFODI.BSLT ΛݟͯΈ·͠ΐ͏
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/
ݱঢ়쎅1ZUIPO쎅ੑೳଌఆ https://www.techempower.com/benchmarks/
ؙʑ쎅ੑೳଌఆ݁Ռ •Uvicorn͕͍Α͏Ͱ͢ •ͨͩASGIରԠͷαʔό…Uvicorn͔͠ͷ͍ͬͯ·ͤΜ
)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI Web ServerͷҰཡ Daphne Mangum IUUQTHJUIVCDPNqPSJNPOENBODBBXFTPNFBTHJ
쎟썝쎛썦쏃쏉썗쏒 •UvicornͱHypercornͷੑೳൺֱ •FWͪΖΜɺେਓؾFastAPIͰ
6WJDPSOͱ)ZQFSDPSOͰ ੑೳΛൺֱ
6WJDPSOͱ)ZQFSDPSOͰ ੑೳΛൺֱʢΏΔͬͱʣ
•࣮ߦڥϩʔΧϧϚγϯ •ࢦඪɺॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒʗ1ඵ͋ͨΓʹࡹ͚ΔϦΫΤετ •ੑೳଌఆπʔϧͱͯ͠ɺab ίϚϯυΛ༻͢Δ •؆୯ͳWebΞϓϦέʔγϣϯΛUvicorn/HypercornͰಈ͔͢ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •ϓϩτίϧhttp/1.1ʢSͳ͠ʣ
αʔό Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •Uvicorn •Hypercorn
0.11.0 0.11.8
αʔό •Uvicorn •Hypercorn 0.11.0 0.11.8 Webαʔό Web Framework ⁶ ⁶
ʢASGIʣ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ϋʔυΣΞڥ •Macbook Pro •2.6 GHz 6ίΞ Intel Core i7 •ϝϞϦ
16GB 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
쎿썗쏚쎿쎮쏓쎅ॲཧ @app.get("/query") async def get_message(): return {"text": f"spam, egg, spam
and spam!"}
ҎԼ3ͭ݅ •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 •ΫϥΠΞϯτಉ࣌ଓ 50, ϦΫΤετ 5000 •ΫϥΠΞϯτಉ࣌ଓ
100, ϦΫΤετ 10000 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ҎԼ3ͭ݅ •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 •ΫϥΠΞϯτಉ࣌ଓ 50, ϦΫΤετ 5000 •ΫϥΠΞϯτಉ࣌ଓ
100, ϦΫΤετ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ҎԼ3ͭ݅ •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 •ΫϥΠΞϯτಉ࣌ଓ 50, ϦΫΤετ 5000 •ΫϥΠΞϯτಉ࣌ଓ
100, ϦΫΤετ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ → ૣ͍ͱྑ͍ → ଟ͍ͱྑ͍ 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
•ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ
100 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100
ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 ϦΫΤετ [s] Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ Uvicorn Hypercorn
•ΫϥΠΞϯτಉ࣌ଓ 50, ϦΫΤετ 5000
ऴྃ࣌ؒ [s] ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ Uvicorn Hypercorn Uvicorn Hypercorn
6WJDPSO썿)ZQFSDPSO썾ੑೳൺֱ •ΫϥΠΞϯτಉ࣌ଓ 100, ϦΫΤετ 10000
ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn
None
None
•Uvicorn ܰྔ 6WJDPSO쎅ಛ
6WDPSO쎅ಛ •Uvicorn ܰྔ •Uvicorn uvloop ͱ͍͏ asyncio ͷߴԽπʔϧ͕ೖ͍ͬͯΔ
6WDPSO쎅ಛ •Uvicorn ܰྔ •Uvicorn uvloop ͱ͍͏ asyncio ͷߴԽπʔϧ͕ೖ͍ͬͯΔ
6WDPSO쎅ಛ •Uvicorn ܰྔ •Uvicorn uvloop ͱ͍͏ asyncio ͷߴԽπʔϧ͕ೖ͍ͬͯΔ
6WDPSO쎅ಛ •Uvicorn ܰྔ •Uvicorn uvloop ͱ͍͏ asyncio ͷߴԽπʔϧ͕ೖ͍ͬͯΔ
•Hypercorn Ͱ uvloop Λ͏͜ͱ͕Ͱ͖Δʂʂʂ IUUQTQHKPOFTHJUMBCJPIZQFSDPSO
)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
)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
•ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡
썾ੑೳൺֱ
ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌ଓ 10, ϦΫΤετ 100 ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ
•ΫϥΠΞϯτಉ࣌ଓ 50, ϦΫΤετ 5000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ
•ΫϥΠΞϯτಉ࣌ଓ 100, ϦΫΤετ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] Uvicorn Hypercorn Uvicorn Hypercorn 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ
•ΫϥΠΞϯτಉ࣌ଓ 100, ϦΫΤετ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] 6WJDPSO썿)ZQFSDPSO VWMPPQ썙쎡 썾ੑೳൺֱ Uvicorn Hypercorn Uvicorn Hypercorn Hypercorn - uvloop Hypercorn - uvloop
쎕썿쎘 •ͬͺΓUvicorn͍
쎕썿쎘 •ͬͺΓUvicorn͍ •͍ASGI WebαʔόUvicornͰྑͦ͞͏
쎕썿쎘 •ͬͺΓUvicorn͍ •͍ASGI WebαʔόUvicornͰྑͦ͞͏ •Ͱଞͷ͍Βͳ͍….ʁʁ
쎕썿쎘 •ͬͺΓUvicorn͍ •͍ASGI WebαʔόUvicornͰྑͦ͞͏ •Ͱଞͷ͍Βͳ͍….ʁʁ •HypercornΓͩ͘͞ΜͳWebαʔό
쎕썿쎘 •ͬͺΓUvicorn͍ •͍ASGI WebαʔόUvicornͰྑͦ͞͏ •Ͱଞͷ͍Βͳ͍….ʁʁ •HypercornΓͩ͘͞ΜͳWebαʔό •PyCon mini Hiroshima Ͱ͠ΌͬͨͷͰڵຯ͕͋Ε͝ཡ͍ͩ͘͞ʂ
IUUQTTQFBLFSEFDLDPNKSGLIUUQUPBTHJXFCTBCBGBMTFHVBOYJIZQFSDPSOXPMJOJ
ࢀߟࢿྉ •Hypercorn IUUQTQHKPOFTHJUMBCJPIZQFSDPSOJOEFYIUNM •jrfk / fastapi-hypercorn_Performance-measurement IUUQTHJUIVCDPNKSGLGBTUBQJIZQFSDPSO@1FSGPSNBODFNFBTVSFNFOU