DjangoCongressJP 2021 の登壇資料です。
Django 3.2 ASGI対応Junya FukudaDjangoCongress JP 2021-こわくない asyncio 基礎とasync viewの使い所
View Slide
•ా ൏ʢJunya Fukudaʣʢ@JunyaFffʣ•גࣜձࣾຊγεςϜٕݚʢJSLʣॴଐ ݝͷձࣾ•WebΤϯδχΞ•GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ•Effective Python ͷಡॻձͬͯ·͢ 📚•ʢ͓͠͝ͱͰʣόϦϡʔϒοΫε•ຊ͖ʹѪ͞ΕΔαʔϏεΛࢦͯ͠ʢݹຊങऔɾൢചʣΪʔΫϥϘಡॻձ
こんにちは⻑野!
ハイブリット開催ですね🎉(オンライン&オフライン)
ハイブリット開催ですね🎉(オンライン&オフライン)わたしは初めてのオフラインです。
オフラインのひと〜👋
オンラインのひと〜👋
🙌
Django 3.2
•Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress JPDjango 3.2•Django 3 ͷۄͷ1ͭ•Django 3.0 - ASGIରԠ•Django 3.1 - Async View, ϛυϧΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ
•Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongressDjango 3.2•Django 3 ͷۄͷ1ͭ•Django 3.0 - ASGIରԠ•Django 3.1 - Async View, ϛυϧΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ
•Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongressDjango 3.2•Django 3 ͷۄͷ1ͭ•Django 3.0 - ASGIରԠ•Django 3.1 - Async View, ϛυϧΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ•Django 3.x or 4? - Async ORM
Django 3.0 - ASGI対応•WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ༷って?
Django 3.0 - ASGI対応•WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ༷•WSGIͷਫ਼ਆతޙܧって?
Django 3.0 - ASGI対応•WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ༷•WSGIͷਫ਼ਆతޙܧ•Gunicorn uWSGI ⁶ Django Flask, Pyramidって?
Django 3.0 - ASGI対応•WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ༷•WSGIͷਫ਼ਆతޙܧ•Gunicorn uWSGI ⁶ Django Flask, Pyramid•Uvicorn Hypercorn ⁶ Django FastAPI, Starletteって?
Django 3.0 - ASGI対応•WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ༷•WSGIͷਫ਼ਆతޙܧ•Gunicorn uWSGI ⁶ Django Flask, Pyramid•Uvicorn Hypercorn ⁶ Django FastAPI, Starlette•WSGIͱASGIɺͳʹ͕ҧ͏ͷ͔って?WSGI
WSGI
WSGI Web Server Gateway Interface
WSGI Web Server Gateway InterfaceASGI
WSGI Web Server Gateway InterfaceASGI Asynchronous Server Gateway Interface
WSGI Web Server Gateway InterfaceASGI Asynchronous Server Gateway Interface⾮同期
WSGI Web Server Gateway InterfaceASGI Asynchronous Server Gateway Interface⾮同期ASGI= asyncio
•Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongressDjango 3.2•Django 3 ͷۄͷ1ͭ•Django 3.0 - ASGIରԠ•Django 3.1 - Async View, ϛυϧΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ•Django 3.x or 4? - Async ORMasyncioରԠ
本⽇のおしながき•Django 3.1 - Async View ͷ͍ॴ•Django 3.x or 4? - Async ORM•ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ
•asyncio͜Θ͍ͳ͋…•Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ•Django ORM ͍͚Δͷʁʁ
•asyncio͜Θ͍ͳ͋…•Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ•Django ORM ͍͚Δͷʁʁ•asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ 👋
•asyncio͜Θ͍ͳ͋…•Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ•Django ORM ͍͚Δͷʁʁ•asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ 👋•Django async view ͬͯͦ͏͍͏ͱ͖Ͷ 🙌
•asyncio͜Θ͍ͳ͋…•Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ•Django ORM ͍͚Δͷʁʁ•asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ 👋•Django async view ͬͯͦ͏͍͏ͱ͖Ͷ 🙌•Django async ORM ͨͷ͠Έͩͳ͋ʙ ✊
すべてはasync/awaitから始まった
>IUUQTflPSJNPOEEFWCMPHBSUJDMFTJOUSPEVDUJPOUPBTHJBTZODQZUIPOXFCすべてはasync/awaitから始まった
asyncioはこわくない
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦasyncioはこわくない
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.5 Ͱ async/await ߏจasyncioはこわくない
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない•ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない•ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ•γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない•ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ•γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO•ઌRFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮ aioquic
asyncio めっちゃこわい
•͜Θ͔ͬͨasyncio めっちゃこわい
•͜Θ͔ͬͨ•ίϧʔνϯා͘ͳ͍ - Minimum Viable Programmer ʢϒϩάʣ•Using Asyncio in Python - ΦϥΠϦʔ ʢ🐸ຊʣasyncio めっちゃこわい•2ͭͷग़ձ͍
•asyncio ڊେ対象はアプリーケーション開発者
•asyncio ڊେ対象はアプリーケーション開発者•ެࣜυΩϡϝϯτߴϨϕϧ APIͱϨϕϧAPIʹ͔ΕͯΔ
•asyncio ڊେ•Θͨͨͪ͠ΞϓϦέʔγϣϯ։ൃऀ対象はアプリーケーション開発者•ެࣜυΩϡϝϯτߴϨϕϧ APIͱϨϕϧAPIʹ͔ΕͯΔ
•asyncio ڊେ•ϑϨʔϜϫʔΫϥΠϒϥϦ։ൃऀ͚ͷػೳͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏•Θͨͨͪ͠ΞϓϦέʔγϣϯ։ൃऀ対象はアプリーケーション開発者•ެࣜυΩϡϝϯτߴϨϕϧ APIͱϨϕϧAPIʹ͔ΕͯΔ
•asyncio ڊେ•ϑϨʔϜϫʔΫϥΠϒϥϦ։ൃऀ͚ͷػೳͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏•Θͨͨͪ͠ΞϓϦέʔγϣϯ։ൃऀ対象はアプリーケーション開発者•ެࣜυΩϡϝϯτߴϨϕϧ APIͱϨϕϧAPIʹ͔ΕͯΔ•ΞϓϦέʔγϣϯ։ൃऀ͚Λରʹͨ͠༰Ͱ͢
•asyncio ڊେ•ϑϨʔϜϫʔΫϥΠϒϥϦ։ൃऀ͚ͷػೳͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏•Θͨͨͪ͠ΞϓϦέʔγϣϯ։ൃऀ対象はアプリーケーション開発者•ެࣜυΩϡϝϯτߴϨϕϧ APIͱϨϕϧAPIʹ͔ΕͯΔ•ΞϓϦέʔγϣϯ։ൃऀ͚Λରʹͨ͠asyncio•લఏࣝͱͯ͠ݴ༿ͷઆ໌ͱɺasyncioͰΘͨͨͪ͠ʹͱͬͯඞཁͳ͜ͱ
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない こわい•ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ•γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO•ઌRFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮ aioquic
⾔葉を完全に理解する
IUUQTEPDTQZUIPOPSHKBMJCSBSZBTZODJPIUNM
前提知識並⾏処理
前提知識並⾏処理並列処理
前提知識並⾏処理並列処理順次処理
前提知識並⾏処理並列処理順次処理タスクの処理
並⾏処理並列処理順次処理
並⾏処理並列処理順次処理通常の関数を呼び出していく処理
並⾏処理並列処理順次処理通常の関数を呼び出していく処理multiprocessingモジュール
並⾏処理並列処理順次処理通常の関数を呼び出していく処理multiprocessingモジュールthreadingモジュール asyncioモジュール
ちょっとわかりにくいのでレストラン🍽に例えます
レストラン
レストランどんなタスクがあるでしょうか
注⽂をとる
料理を作る注⽂をとる
料理を作る注⽂をとる 料理を運ぶ
順次処理
順次処理注⽂を取る - 料理を作る - 料理を運ぶ
順次処理注⽂を取る - 料理を作る - 料理を運ぶ完了してから次のタスク
並列処理
並列処理注⽂を取る料理を作る料理を運ぶ
並列処理注⽂を取る料理を作る料理を運ぶ複数のタスクを同時に着⼿する
並⾏処理
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncio
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncioシングルスレッド
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncioシングルスレッド = ワンオペ
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncioシングルスレッド = ワンオペ同じ⼈
並⾏処理注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔
asyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた
asyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた お客様
asyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた お客様←注⽂
asyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた 考え中のお客様←注⽂待ち
asyncioシングルスレッド = ワンオペどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた 考え中のお客様←注⽂待ちあなたから⾒て、外部のお客様、から注⽂という⼊⼒を待つ状態
asyncioどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた 考え中のお客様←注⽂待ちあなたから⾒て、外部のお客様、から注⽂という⼊⼒を待つ状態
aどのタイミングでタスクの切り替えをするのでしょうか 🤔あなた 考え中のお客様←注⽂待ちあなたから⾒て、外部のお客様、から注⽂という⼊⼒を待つ状態⾮同期IOsyncio
a sync io
a sync io⼊⼒
a sync io同期 ⼊⼒
a sync ioしない 同期 ⼊⼒
asyncio⾮同期IO
•Python 3.4 Ͱ Ճ͞Εͨඪ४ϥΠϒϥϦ•Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظแදه•Python 3.5 Ͱ async/await ߏจasyncioはこわくない こわい•ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ•γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO•ઌRFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮ aioquicγϯάϧεϨουฒߦॲཧඇಉظ IO
ฒߦॲཧasyncioの周辺はちょっとこわくないγϯάϧεϨουඇಉظ IO
ฒߦॲཧasyncioの周辺はちょっとこわくないγϯάϧεϨουඇಉظ IOϫϯΦϖ
ฒߦॲཧasyncioの周辺はちょっとこわくないγϯάϧεϨουඇಉظ IOϫϯΦϖ外部のお客様、から注⽂という⼊⼒を待たないで他のことする
asyncio
asyncio🌷
asyncio で覚えておくことは3つasyncio
イベントループ
コルーチンイベントループ
コルーチンイベントループタスク
コルーチンイベントループタスク→ やること
コルーチンイベントループタスク→ やること→ やること+実⾏状態をもつ(コルーチンの上位のやつ)
コルーチンイベントループタスク→ やること→ やること+実⾏状態をもつ(コルーチンの上位のやつ)→ やることを管理するもの
注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncio
注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶasyncioコルーチンやタスク
asyncio注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶコルーチンやタスク
asyncio注⽂を取 注⽂を取 注⽂を取コ
asyncioイベントループ注⽂を取 注⽂を取 注⽂を取コ
asyncioイベントループ(あくまでイメージ)注⽂を取 注⽂を取 注⽂を取コ
•ίϧʔνϯͱɺϧʔνϯʢ͍ҙຯͰͷؔʣͷҰछコルーチン
•ίϧʔνϯͱɺϧʔνϯʢ͍ҙຯͰͷؔʣͷҰछコルーチン•Co-routine ͱॻ͘
•ίϧʔνϯͱɺϧʔνϯʢ͍ҙຯͰͷؔʣͷҰछコルーチン•Co-routine ͱॻ͘•ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ
•ίϧʔνϯͱɺϧʔνϯʢ͍ҙຯͰͷؔʣͷҰछコルーチン•Co-routine ͱॻ͘•ؔͷఆٛʹ async Λ͚ͭΔ ɺதஅͯ͠࠶։͢Δͱ͜Ζʹ await•ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ
•ίϧʔνϯͱɺϧʔνϯʢ͍ҙຯͰͷؔʣͷҰछコルーチン•Co-routine ͱॻ͘•ؔͷఆٛʹ async Λ͚ͭΔ ɺதஅͯ͠࠶։͢Δͱ͜Ζʹ await• asyncio Λ͏্Ͱͷجຊͷ͖•ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ
関数を定義def customers_thinking_order():... # ॲཧ
def customers_long_thinking_order():... # ࣌ؒͷ͔͔Δॲཧコルーチンを定義async•async Λ͚ͭΔ͚ͩ•͍ͭ͜ίϧʔνϯؔʹͳΔ•def Ͱఆٛͨؔ͠ͱ΄΅มΘΒͳ͍
def customers_long_thinking_order():await asyncio.sleep(10000)return “͟Δͦ”時間のかかる処理にawaitasync•࣌ؒͷ͔͔ΔॲཧʹawaitΛ͚ͭΔ•͔ͦ͜Βதஅͱ࠶։͢Δ•await Λ͚ͭΔ͜ͱ͕Ͱ͖ΔͷɺίϧʔνϯλεΫʢͳͲʣ
関数を実⾏def customers_long_thinking_order():time.sleep(10000)return “יͦ”>>> print(customers_long_thinking_order())יͦ# ߟͷͷͪ
def customers_long_thinking_order():await asyncio.sleep(10000)return “͟Δͦ”コルーチンを実⾏>>> print(customers_long_thinking_order())async
def customers_long_thinking_order():await asyncio.sleep(10000)return “͟Δͦ”コルーチンを実⾏>>> print(customers_long_thinking_order())asyncat 0x10d949ec0>
asyncioイベントループ注⽂を取 注⽂を取 注⽂を取コ(あくまでイメージ)
•C10Kͷճ•libuv(nodejs)ͷத֩Λͳ͢Έイベントループ
•C10Kͷճ•libuv(nodejs)ͷத֩Λͳ͢Έ•ίϧʔνϯλεΫΛεέδϡʔϦϯάイベントループ
•C10Kͷճ•libuv(nodejs)ͷத֩Λͳ͢Έ•ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷΈ•ίϧʔνϯλεΫΛεέδϡʔϦϯάイベントループ
•C10Kͷճ•libuv(nodejs)ͷத֩Λͳ͢Έ•ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷΈ•ͦ͜·Ͱҙࣝ͠ͳͯ͘ྑ͍ʢͦ͜ʹ͍Δ͜ͱͬͯͯʣ•ίϧʔνϯλεΫΛεέδϡʔϦϯάイベントループ
•C10Kͷճ•libuv(nodejs)ͷத֩Λͳ͢Έ•ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷΈ•ͦ͜·Ͱҙࣝ͠ͳͯ͘ྑ͍ʢͦ͜ʹ͍Δ͜ͱͬͯͯʣ•ίϧʔνϯλεΫΛεέδϡʔϦϯάイベントループ•asyncio ͷத֩Λͳ͢Έ
•Python 3.7 ͰՃ͞Εͨ asyncio.run()イベントループ•ΠϕϯτϧʔϓΛ࡞Δ•λεΫ͕ऴΘͬͨΒআͯ͘͠ΕΔ•asyncio.run(corutine) Λड͚औΔ͜ͱ͕Ͱ͖Δ
•Python 3.7 ͰՃ͞Εͨ asyncio.run()イベントループ•ΠϕϯτϧʔϓΛ࡞Δ•λεΫ͕ऴΘͬͨΒআͯ͘͠ΕΔ•asyncio.run(corutine) Λड͚औΔ͜ͱ͕Ͱ͖Δ•loopΦϒδΣΫτ -> asyncio.get_running_loop() / run_until_complete()
async def customers_long_thinking_order():print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(10000)return “͟Δͦ”イベントループを作る
async def customers_long_thinking_order():print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(10000)return “͟Δͦ”イベントループを作るasync def order():print(“͝จʁ”)menu = await customers_long_thinking_order()print(menu)
イベントループを作るasyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ͝จʁͪΐͬͱͬͯͶ
イベントループを作る͝จʁͪΐͬͱͬͯͶ# …ߟͷͷͪasyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
イベントループを作る͝จʁͪΐͬͱͬͯͶ# …ߟͷͷͪ͟Δͦasyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ# ίϧʔνϯͷΓΛड͚औͬͯprint
イベントループを作る͝จʁͪΐͬͱͬͯͶ# …ߟͷͷͪ͟Δͦasyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ↑ऴΘͬͨΒΠϕϯτϧʔϓআ
考え中のお客様 3⼈とも
async def customers_long_thinking_order():print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep()return “͟Δͦ”await の動作を確認するasync def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order()menu2 = await customers_long_thinking_order()menu2 = await customers_long_thinking_order()print([menu1, memu2, menu3])
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order()menu2 = await customers_long_thinking_order()menu2 = await customers_long_thinking_order()print([menu1, memu2, menu3])await の動作を確認する
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)menu2 = await customers_long_thinking_order(2)menu3 = await customers_long_thinking_order(3)print([menu1, memu2, menu3])await の動作を確認する並⾏実⾏すると3秒で終わるはずasyncio.run(order())
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)menu2 = await customers_long_thinking_order(2)menu3 = await customers_long_thinking_order(3)print([menu1, memu2, menu3])await の動作を確認する並⾏実⾏すると3秒で終わるはずasyncio.run(order())l͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< ͟Δͦ ͟Δͦ ͟Δͦ>UJNF
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)print(menu1)menu2 = await customers_long_thinking_order(2)print(menu2)menu3 = await customers_long_thinking_order(3)print(menu3)await の動作を確認する並⾏実⾏すると3秒で終わるはずasyncio.run(order())
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)print(menu1)menu2 = await customers_long_thinking_order(2)print(menu2)menu3 = await customers_long_thinking_order(3)print(menu3)await の動作を確認する並⾏実⾏すると3秒で終わるはずasyncio.run(order())l͝จʁzͪΐͬͱͬͯͶ ͟ΔͦͪΐͬͱͬͯͶ ͟ΔͦͪΐͬͱͬͯͶ b͟ΔͦUJNF
async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)print(menu1)menu2 = await customers_long_thinking_order(2)print(menu2)menu3 = await customers_long_thinking_order(3)print(menu3)await の動作を確認する並⾏実⾏すると3秒で終わるはずasyncio.run(order())コルーチンをawaitするだけでは並⾏にならない1つのコルーチンが終わってから次のコルーチン 普通の関数実⾏と同じl͝จʁzͪΐͬͱͬͯͶ ͟ΔͦͪΐͬͱͬͯͶ ͟ΔͦͪΐͬͱͬͯͶ b͟ΔͦUJNF
•TaskΦϒδΣΫτ•ίϧʔνϯΛϥοϓ͠ɺ࣮ߦঢ়ଶΛͭ•࡞Δํ๏େ͖͘2ͭ•Python3.7 ͰՃ͞Εͨ asyncio.create_task()•Πϕϯτϧʔϓʹొ͢Δ•ฒྻ࣮ߦΛॿ͚Δ gather()タスク
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)menu2 = await customers_long_thinking_order(2)menu3 = await customers_long_thinking_order(3)print([menu1, memu2, menu3])asyncio.run(order())
初めてのタスクasync def order():print(“͝จʁ”)menu1 = await customers_long_thinking_order(1)menu2 = await customers_long_thinking_order(2)menu3 = await customers_long_thinking_order(3)print([menu1, memu2, menu3])asyncio.run(order())async def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)task1 = asyncio.create_task(customers_long_thinking_order(1))task2 = asyncio.create_task(customers_long_thinking_order(2))task3 = asyncio.create_task(customers_long_thinking_order(3))menu1 = await task1menu1 = await task2menu1 = await task3print([menu1, memu2, menu3])asyncio.run(order())
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)task1 = asyncio.create_task(customers_long_thinking_order(1))task2 = asyncio.create_task(customers_long_thinking_order(2))task3 = asyncio.create_task(customers_long_thinking_order(3))menu1 = await task1menu1 = await task2menu1 = await task3print([menu1, memu2, menu3])asyncio.run(order())実⾏してみましょう
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)task1 = asyncio.create_task(customers_long_thinking_order(1))task2 = asyncio.create_task(customers_long_thinking_order(2))task3 = asyncio.create_task(customers_long_thinking_order(3))menu1 = await task1menu2 = await task2menu3 = await task3print([menu1, memu2, menu3])asyncio.run(order())実⾏してみましょうͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< ͟Δͦ ͟Δͦ ͟Δͦ>UJNF
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)task1 = asyncio.create_task(customers_long_thinking_order(1))task2 = asyncio.create_task(customers_long_thinking_order(2))task3 = asyncio.create_task(customers_long_thinking_order(3))menu1 = await task1print(menu1)menu2 = await task2print(menu2)menu3 = await task3print(menu2)asyncio.run(order())実⾏してみましょう
初めてのタスクasync def customers_long_thinking_order(num: int):print(“ͪΐͬͱͬͯͶ”)await asyncio.sleep(num)return num, “͟Δͦ”async def order():print(“͝จʁ”)task1 = asyncio.create_task(customers_long_thinking_order(1))task2 = asyncio.create_task(customers_long_thinking_order(2))task3 = asyncio.create_task(customers_long_thinking_order(3))menu1 = await task1print(menu1)menu2 = await task2print(menu2)menu3 = await task3print(menu2)asyncio.run(order())実⾏してみましょうl͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ ͟Δͦ ͟Δͦ ͟ΔͦUJNF
gatherを利⽤して結果をまとめて受け取るasync def customers_long_thinking_order(num: int):print("ͪΐͬͱͬͯͶ")await asyncio.sleep(num)return num, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [customers_long_thinking_order(3000),customers_long_thinking_order(200),customers_long_thinking_order(10),]result = await asyncio.gather(*tasks)print(result)asyncio.run(order())
gatherを利⽤して結果をまとめて受け取るasync def customers_long_thinking_order(num: int):print("ͪΐͬͱͬͯͶ")await asyncio.sleep(num)return num, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [customers_long_thinking_order(3000),customers_long_thinking_order(200),customers_long_thinking_order(10),]result = await asyncio.gather(*tasks)print(result)asyncio.run(order())l͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< ͟Δͦ ͟Δͦ ͟Δͦ>UJNF
考え中のお客様
考え中のお客様検索しないと決められない
考え中のお客様検索しないと決められない3⼈とも
考え中のお客様検索しないと決められない3⼈ともasyncio⾮同期IO
考え中のお客様がgoogle検索async def long_think(num: int):print("ͪΐͬͱͬͯͶ")response = requests.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [long_think(3), long_think(2), long_think(1)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order())print("time: ", time() - start)
考え中のお客様がgoogle検索async def long_think(num: int):print("ͪΐͬͱͬͯͶ")response = requests.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [long_think(3), long_think(2), long_think(1)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order())print("time: ", time() - start)l͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< 3FTQPOTF> b͟Δͦ` >UJNF
考え中のお客様がgoogle検索async def long_think(num: int):print("ͪΐͬͱͬͯͶ")response = requests.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [long_think(3), long_think(2), long_think(1)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order(), debug=True)print("time: ", time() - start)l͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< 3FTQPOTF> b͟Δͦ` >UJNF
考え中のお客様がgoogle検索async def long_think(num: int):print("ͪΐͬͱͬͯͶ")response = requests.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")tasks = [long_think(3), long_think(2), long_think(1)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order(), debug=True)print("time: ", time() - start)l͝จʁzͪΐͬͱͬͯͶUPPLTFDPOETͪΐͬͱͬͯͶUPPLTFDPOETͪΐͬͱͬͯͶUPPLTFDPOET 3FTQPOTF> ͟Δͦ>UJNF
考え中のお客様がgoogle検索async def long_think(client, num: int):print("ͪΐͬͱͬͯͶ")response = await client.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")async with httpx.AsyncClient() as client:tasks = [long_think(client, 1), long_think(client, 2), long_think(client, 3)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order(), debug=True)print("time: ", time() - start)
考え中のお客様がgoogle検索async def long_think(client, num: int):print("ͪΐͬͱͬͯͶ")response = await client.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def order():print("“͝จʁ”")async with httpx.AsyncClient() as client:tasks = [long_think(client, 1), long_think(client, 2), long_think(client, 3)]result = await asyncio.gather(*tasks)print(result)start = time()asyncio.run(order(), debug=True)print("time: ", time() - start)l͝จʁzͪΐͬͱͬͯͶͪΐͬͱͬͯͶͪΐͬͱͬͯͶ< 3FTQPOTF0,> b͟Δͦ`UJNF
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓ
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓؔʹ async Λ͚ͭΔ͚ͩ ؊await
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ͓ͯ͘͠ͱྑ͖ʹܭΒͬͯΓସ͑ͯ͘ΕΔɻؔʹ async Λ͚ͭΔ͚ͩ ؊await
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ͓ͯ͘͠ͱྑ͖ʹܭΒͬͯΓସ͑ͯ͘ΕΔɻ登録してあるタスクをawaitのタイミングで切り替える。ただしasyncio対応が必要。ؔʹ async Λ͚ͭΔ͚ͩ ؊await
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓcreate_task(coro) - Πϕϯτϧʔϓʹొgather(λεΫ ·ͨ ίϧʔνϯ) - ·ͱΊͯ݁ՌΛड͚औΕΔasync def hoge()await λεΫ ·ͨ ίϧʔνϯasynio.run(ίϧʔνϯ)༨ྗ͕͋Εɺget_running_loop()ͬͯͷ 🙏
ίϧʔνϯasyncioはこわくないλεΫΠϕϯτϧʔϓcreate_task(coro) - Πϕϯτϧʔϓʹొgather(λεΫ ·ͨ ίϧʔνϯ) - ·ͱΊͯ݁ՌΛड͚औΕΔasync def hoge()await λεΫ ·ͨ ίϧʔνϯasynio.run(ίϧʔνϯ)༨ྗ͕͋Εɺget_running_loop()ͬͯͷ 🙏まずはこれを抑えましょう
わたしたちはいくつかの武器を⼿に⼊れました。
注⽂を取る - 料理を 注⽂を取る - 料理を 注⽂を取る - 料理を並⾏処理
注⽂を取る 注⽂を取る 注⽂を取る並⾏処理 ⾮同期IO
注⽂を取る 注⽂を取る 注⽂を取る並⾏処理⾮同期IOコasyncio
注⽂を取る 注⽂を取る 注⽂を取る並⾏処理⾮同期IOコasyncioちょっとわがまま
本⽇のおしながき•Django 3.1 - Async View•Django 3.x or 4? - Async ORM•ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ
Django Async View ͷ͍ॴ•ASGIରԠͱasync view
Django Async View ͷ͍ॴ•ASGIରԠͱasync view•asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ
Django Async View ͷ͍ॴ•IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ•ASGIରԠͱasync view•asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ
Django Async View ͷ͍ॴ•IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ•ྫ͑APIͷϦΫΤετ•ྫ͑IoTσόΠεͱͷMQTT•ASGIରԠͱasync view•asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ
Django Async View ͷ͍ॴ•IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ•ྫ͑APIͷϦΫΤετ•ྫ͑IoTσόΠεͱͷMQTT•ASGIରԠͱasync view•asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ•DjangoΛར༻͍ͨ͠߹
Django Async View の使い所•ιʔεͷྫasync def long_think(client, num: int):print("ͪΐͬͱͬͯͶ")response = await client.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def async_view(request):print("“͝จʁ”")async with httpx.AsyncClient() as client:tasks = [long_think(client) for i in range(10)]result = await asyncio.gather(*tasks)return HttpResponse(result)
Django Async View の使い所•ιʔεͷྫasync def long_think(client, num: int):print("ͪΐͬͱͬͯͶ")response = await client.get("https://www.google.com/search?q=͓͍͍͓͠ڶഴʁ")return num, response, "͟Δͦ"async def async_view(request):print("“͝จʁ”")async with httpx.AsyncClient() as client:tasks = [long_think(client) for i in range(10)]result = await asyncio.gather(*tasks)return HttpResponse(result)BTZODJPSVO ͠ͳ͍ͷʁ🤔
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ•ΒͣΒͣͷ͏ͪʹɻ
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ•ΒͣΒͣͷ͏ͪʹɻ•ASGI Django ͬͯͲ͏࣮ͬͯߦ͠·͔͢ʁ
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ•ΒͣΒͣͷ͏ͪʹɻ•ASGI Django ͬͯͲ͏࣮ͬͯߦ͠·͔͢ʁ$ uvicorn hello_async_world.asgi:application
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ•ΒͣΒͣͷ͏ͪʹɻ•ASGI Django ͬͯͲ͏࣮ͬͯߦ͠·͔͢ʁ$ uvicorn hello_async_world.asgi:application•ASGIͰɺPythonͷWebαʔόͱPythonͷWeb FWΛܨ͍ͰΔ
Django Async View の使い所•Έͳ͞Μ͏ͯ͠·͢ɻ•ΒͣΒͣͷ͏ͪʹɻ•ASGI Django ͬͯͲ͏࣮ͬͯߦ͠·͔͢ʁ$ uvicorn hello_async_world.asgi:application•ASGIͰɺPythonͷWebαʔόͱPythonͷWeb FWΛܨ͍ͰΔ•ASGIαʔόଆͰΠϕϯτϧʔϓΛ࣮ߦ͍ͯ͠Δ
Django Async View の使い所•ඇಉظͳॲཧΛߦ͍͍ͨ߹ʹɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ
Django Async View の使い所•ඇಉظͳॲཧΛߦ͍͍ͨ߹ʹɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ•ͨͩඇಉظͳॲཧͷதʹɺಉظͷॲཧʢasyncioରԠ͍ͯ͠ͳ͍ʣ͕͍Δ
Django Async View の使い所•ඇಉظͳॲཧΛߦ͍͍ͨ߹ʹɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ•ͨͩඇಉظͳॲཧͷதʹɺಉظͷॲཧʢasyncioରԠ͍ͯ͠ͳ͍ʣ͕͍Δ•ಉظॲཧʹɺDjango͕༻ҙͯ͘͠Ε͍ͯΔಉظॲཧˠඇಉظॲཧʹ͢Δ•sync_to_async()
Django Async View の使い所•sync_to_async()ಉظؔΛड͚औΓɺͦΕΛϥοϓͯ͠ඇಉظؔΛฦ͠·͢ɻϥούʔ·ͨσίϨʔλͱͯ͠༻Ͱ͖·͢ɻ
Django Async View の使い所•sync_to_async()ಉظؔΛड͚औΓɺͦΕΛϥοϓͯ͠ඇಉظؔΛฦ͠·͢ɻϥούʔ·ͨσίϨʔλͱͯ͠༻Ͱ͖·͢ɻasync_function = sync_to_async(sync_function, thread_sensitive=False)async_function = sync_to_async(sensitive_sync_function, thread_sensitive=True)@sync_to_asyncdef sync_function(...):...IUUQTEPDTEKBOHPQSPKFDUDPNFOUPQJDTBTZODTZODUPBTZOD
Django Async View の使い所•sync_to_async()asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ͢Δ͜ͱ͕Ͱ͖·͢ɻʢDjangoʹݶͬͨͰͳ͘ʣ
Django Async View の使い所•sync_to_async()asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ͢Δ͜ͱ͕Ͱ͖·͢ɻʢDjangoʹݶͬͨͰͳ͘ʣconcurrent.futures Ϟδϡʔϧʢthreading ͱ multiprocessing Λ༰қʹ͑Δඪ४ϥΠϒϥϦʣ
Django Async View の使い所•sync_to_async()asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ͢Δ͜ͱ͕Ͱ͖·͢ɻʢDjangoʹݶͬͨͰͳ͘ʣconcurrent.futures Ϟδϡʔϧʢthreading ͱ multiprocessing Λ༰қʹ͑Δඪ४ϥΠϒϥϦʣ͜ΕͰඇಉظʹͰ͖Δ…ʹͰ͖·͕͢ɺ࣮ߦʹίετ͕͔͔ΓʹӨڹ͕ଟগ͋Γ·͢ɻ
Django Async View の使い所•ASGIରԠͱasync view
Django Async View の使い所•ASGIରԠͱasync view•͜ΕʹΑͬͯɺDjangoͰasyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ
Django Async View の使い所•ASGIରԠͱasync view•͜ΕʹΑͬͯɺDjangoͰasyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ•ಉظॲཧ concurrent.futures Λͬͨϥοϓ͕Մೳ
Django Async View の使い所•ASGIରԠͱasync view•͜ΕʹΑͬͯɺDjangoͰasyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ•ಉظॲཧ concurrent.futures Λͬͨϥοϓ͕Մೳ•·͍ͩͬͯΔಉظॲཧ
Django Async View の使い所•ASGIରԠͱasync view•͜ΕʹΑͬͯɺDjangoͰasyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ•ಉظॲཧ concurrent.futures Λͬͨϥοϓ͕Մೳ•·͍ͩͬͯΔಉظॲཧ•ͦ͏ɻ࠷ޙͷࡆɻDjangoͷORM͕͍ͬͯΔɻʢasyncio ະରԠʣ
Async ORM
Node.jsの作成者であるRyan Dahlは尋ねました。
Node.jsの作成者であるRyan Dahlは尋ねました。「データベースにクエリを実⾏している間、ソフトウェアは何をしているのですか?」
Node.jsの作成者であるRyan Dahlは尋ねました。「データベースにクエリを実⾏している間、ソフトウェアは何をしているのですか?」https://www.youtube.com/watch?v=ztspvPYybIYもちろん、答えは何もありませんでした。データベースが応答するのを待っていました。
Django ORM•DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM
Django ORM•DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM•ORMasyncioରԠ͍ͯ͠ͳ͍
Django ORM•DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM•ඇಉظIOͷརΛ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ•ORMasyncioରԠ͍ͯ͠ͳ͍
Django ORM•DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM•ඇಉظIOͷརΛ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ•ͪΖΜσʔλϕʔεͷΞΫηε༗ޮ•ORMasyncioରԠ͍ͯ͠ͳ͍
Django ORM•DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM•ඇಉظIOͷརΛ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ•ͪΖΜσʔλϕʔεͷΞΫηε༗ޮ•ࠓ͞Θ͍ͬͯΔΞϓϦέʔγϣϯΛࢥ͍ग़͍ͯͩ͘͠͞ɻDB͕ඇಉظʹͳͬͨΒ…•ORMasyncioରԠ͍ͯ͠ͳ͍
Async ORM•Async ORM ͷಓ•PyConline AU 2020 "Taking Django's ORM Async”•Django ίΞ developer Andrew Godwin ͞Μ
Async ORM•Async ORM ͷಓ•APIͷσβΠϯ͕ॏཁͩ•ͨͩɺasync DBAPI ·ͩͳ͍…•՝͋Δ•Model API / ΫΤϦ / DBΞμϓλʔ ͱରԠ͍ͯ͘͠ܭը
Async ORM•Async ORM ͷಓ•ඇಉظΛՄೳͳݶΓ࠷ߴͷͷʹ͢Δ͜ͱΛ͓͑͠·͢ 🎉🎉🎉•҆શͳඇಉظϓϩάϥϛϯά•͕ͯ͢ඇಉظͰɺඇಉظͰΤϥʔ͕ىͤ͜ͳ͍ੈքΛ࣮ݱ
Async ORM•۩ମతͳόʔδϣϯ…͏গ͔͔͠Γͦ͏Ͱ͢•ָ͠ΈͰ͢Ͷ˒IUUQTGPSVNEKBOHPQSPKFDUDPNUBTZODISPOPVTPSN
まとめ•asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔コ•Django async view - ಉظͱඇಉظ߹ΘͤͯIOόϯυͳॲཧΛத৺ʹ…•Async ORM - ָ͠ΈͰ͢ͶʂʢPyhtonͰ asyncio ରԠͷORMΞμϓλʔ͢Ͱʹ͍͔ͭ͋͘Γ·͢ɻʣ·ͨɺDjangoOSSͰ͢ɻϦϙδτϦΛͷ͍ͧͯΈΔͷྑ͍͔͠Ε·ͤΜ 👀IUUQTHJUIVCDPNEKBOHPEKBOHP
•ίϧʔνϯා͘ͳ͍ - Minimum Viable Programmer•Using Asyncio in Python - Oreilly & Associates Inc参考•Better Examples of Django Async Views•https://dev.to/arocks/better-examples-of-django-async-views-295d•asyncioͷTaskʹؔ͢Δجૅࣝ•https://aish.dev/python/20200711_asyncio_task.html•DjangoCon 2020 | How To Break Django: With Async - Andrew Godwin•https://www.youtube.com/watch?v=19Uh_PA_8Rc•"Taking Django's ORM Async" - Andrew Godwin (PyConline AU 2020)•https://youtu.be/ibAmA4QQDhs
ご静聴ありがとうございました 👋