Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Django 3.2 ASGI対応 - こわくない asyncio 基礎とasync viewの使い所

D3be793aaf76ed1915295001712ce0f1?s=47 jrfk
July 03, 2021

Django 3.2 ASGI対応 - こわくない asyncio 基礎とasync viewの使い所

DjangoCongressJP 2021 の登壇資料です。

D3be793aaf76ed1915295001712ce0f1?s=128

jrfk

July 03, 2021
Tweet

Transcript

  1. Django 3.2 ASGI対応 Junya Fukuda DjangoCongress JP 2021 -こわくない asyncio

    基礎とasync viewの使い所
  2. •෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ •WebΤϯδχΞ •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ •Effective

    Python ͷಡॻձ΍ͬͯ·͢ 📚 •ʢ͓͠͝ͱͰʣόϦϡʔϒοΫε •ຊ޷͖ʹѪ͞ΕΔαʔϏεΛ໨ࢦͯ͠ʢݹຊങऔɾൢചʣ ΪʔΫϥϘ௕໺ಡॻձ
  3. こんにちは⻑野!

  4. ハイブリット開催ですね🎉 (オンライン&オフライン)

  5. ハイブリット開催ですね🎉 (オンライン&オフライン) わたしは初めてのオフラインです。

  6. オフラインのひと〜👋

  7. オンラインのひと〜👋

  8. 🙌

  9. Django 3.2

  10. •Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress JP Django 3.2 •Django 3 ͷ໨ۄͷ1ͭ •Django

    3.0 - ASGIରԠ •Django 3.1 - Async View, ϛυϧ΢ΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ
  11. •Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress Django 3.2 •Django 3 ͷ໨ۄͷ1ͭ •Django 3.0

    - ASGIରԠ •Django 3.1 - Async View, ϛυϧ΢ΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ
  12. •Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress Django 3.2 •Django 3 ͷ໨ۄͷ1ͭ •Django 3.0

    - ASGIରԠ •Django 3.1 - Async View, ϛυϧ΢ΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ •Django 3.x or 4? - Async ORM
  13. Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ って?

  14. Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ •WSGIͷਫ਼ਆతޙܧ って?

  15. Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ •WSGIͷਫ਼ਆతޙܧ •Gunicorn ΍ uWSGI ⁶

    Django ΍ Flask, Pyramid って?
  16. Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ •WSGIͷਫ਼ਆతޙܧ •Gunicorn ΍ uWSGI ⁶

    Django ΍ Flask, Pyramid •Uvicorn ΍ Hypercorn ⁶ Django ΍ FastAPI, Starlette って?
  17. Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ •WSGIͷਫ਼ਆతޙܧ •Gunicorn ΍ uWSGI ⁶

    Django ΍ Flask, Pyramid •Uvicorn ΍ Hypercorn ⁶ Django ΍ FastAPI, Starlette •WSGIͱASGIɺͳʹ͕ҧ͏ͷ͔ って? WSGI
  18. WSGI

  19. WSGI Web Server Gateway Interface

  20. WSGI Web Server Gateway Interface ASGI

  21. WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

  22. WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

  23. WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

    ⾮同期
  24. WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

    ⾮同期 ASGI= asyncio
  25. •Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress Django 3.2 •Django 3 ͷ໨ۄͷ1ͭ •Django 3.0

    - ASGIରԠ •Django 3.1 - Async View, ϛυϧ΢ΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ •Django 3.x or 4? - Async ORM
  26. •Django 3 ͕ग़͔ͯΒͷॳΊͯͷDjangoCongress Django 3.2 •Django 3 ͷ໨ۄͷ1ͭ •Django 3.0

    - ASGIରԠ •Django 3.1 - Async View, ϛυϧ΢ΣΞ, ςετΫϥΠΞϯτ ͷαϙʔτ •Django 3.x or 4? - Async ORM asyncioରԠ
  27. 本⽇のおしながき •Django 3.1 - Async View ͷ࢖͍ॴ •Django 3.x or

    4? - Async ORM •ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ
  28. •asyncio͜Θ͍ͳ͋… •Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ •Django ORM ΋͍͚Δͷʁʁ

  29. •asyncio͜Θ͍ͳ͋… •Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ •Django ORM ΋͍͚Δͷʁʁ •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋

    👋
  30. •asyncio͜Θ͍ͳ͋… •Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ •Django ORM ΋͍͚Δͷʁʁ •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋

    👋 •Django async view ͬͯͦ͏͍͏ͱ͖Ͷ 🙌
  31. •asyncio͜Θ͍ͳ͋… •Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ •Django ORM ΋͍͚Δͷʁʁ •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋

    👋 •Django async view ͬͯͦ͏͍͏ͱ͖Ͷ 🙌 •Django async ORM ͨͷ͠Έͩͳ͋ʙ ✊
  32. すべてはasync/awaitから始まった

  33. > IUUQT fl PSJNPOEEFWCMPHBSUJDMFTJOUSPEVDUJPOUPBTHJBTZODQZUIPOXFC すべてはasync/awaitから始まった

  34. asyncioはこわくない

  35. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ asyncioはこわくない

  36. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない

  37. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない
  38. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ
  39. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO
  40. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic
  41. asyncio めっちゃこわい

  42. •͜Θ͔ͬͨ asyncio めっちゃこわい

  43. •͜Θ͔ͬͨ •ίϧʔνϯ͸ා͘ͳ͍ - Minimum Viable Programmer ʢϒϩάʣ •Using Asyncio in

    Python - ΦϥΠϦʔ ʢ🐸ຊʣ asyncio めっちゃこわい •2ͭͷग़ձ͍
  44. •asyncio ͸௒ڊେ 対象はアプリーケーション開発者

  45. •asyncio ͸௒ڊେ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ

  46. •asyncio ͸௒ڊେ •Θͨͨͪ͠͸ΞϓϦέʔγϣϯ։ൃऀ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ

  47. •asyncio ͸௒ڊେ •ϑϨʔϜϫʔΫ΍ϥΠϒϥϦ։ൃऀ޲͚ͷػೳ͸ͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏ •Θͨͨͪ͠͸ΞϓϦέʔγϣϯ։ൃऀ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ

  48. •asyncio ͸௒ڊେ •ϑϨʔϜϫʔΫ΍ϥΠϒϥϦ։ൃऀ޲͚ͷػೳ͸ͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏ •Θͨͨͪ͠͸ΞϓϦέʔγϣϯ։ൃऀ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ •ΞϓϦέʔγϣϯ։ൃऀ޲͚Λର৅ʹͨ͠಺༰Ͱ͢

  49. •asyncio ͸௒ڊେ •ϑϨʔϜϫʔΫ΍ϥΠϒϥϦ։ൃऀ޲͚ͷػೳ͸ͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏ •Θͨͨͪ͠͸ΞϓϦέʔγϣϯ։ൃऀ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ •ΞϓϦέʔγϣϯ։ൃऀ޲͚Λର৅ʹͨ͠asyncio •લఏ஌ࣝͱͯ͠ݴ༿ͷઆ໌ͱɺasyncioͰΘͨͨͪ͠ʹͱͬͯඞཁͳ͜ͱ

  50. •asyncio ͸௒ڊେ •ϑϨʔϜϫʔΫ΍ϥΠϒϥϦ։ൃऀ޲͚ͷػೳ͸ͪΐͬͱ͓͍͓͖ͯ·͠ΐ͏ •Θͨͨͪ͠͸ΞϓϦέʔγϣϯ։ൃऀ 対象はアプリーケーション開発者 •ެࣜυΩϡϝϯτ΋ߴϨϕϧ APIͱ௿ϨϕϧAPIʹ෼͔ΕͯΔ •ΞϓϦέʔγϣϯ։ൃऀ޲͚Λର৅ʹͨ͠asyncio •લఏ஌ࣝͱͯ͠ݴ༿ͷઆ໌ͱɺasyncioͰΘͨͨͪ͠ʹͱͬͯඞཁͳ͜ͱ

  51. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない こわい •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic
  52. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない こわい •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic
  53. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない こわい •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic
  54. ⾔葉を完全に理解する

  55. IUUQTEPDTQZUIPOPSHKBMJCSBSZBTZODJPIUNM

  56. 前提知識 並⾏処理

  57. 前提知識 並⾏処理 並列処理

  58. 前提知識 並⾏処理 並列処理 順次処理

  59. 前提知識 並⾏処理 並列処理 順次処理 タスクの処理

  60. 並⾏処理 並列処理 順次処理

  61. 並⾏処理 並列処理 順次処理

  62. 並⾏処理 並列処理 順次処理

  63. 並⾏処理 並列処理 順次処理 通常の関数を呼び出していく処理

  64. 並⾏処理 並列処理 順次処理 通常の関数を呼び出していく処理 multiprocessingモジュール

  65. 並⾏処理 並列処理 順次処理 通常の関数を呼び出していく処理 multiprocessingモジュール threadingモジュール asyncioモジュール

  66. ちょっとわかりにくいので レストラン🍽に例えます

  67. レストラン

  68. レストラン どんなタスクが あるでしょうか

  69. 注⽂をとる

  70. 料理を作る 注⽂をとる

  71. 料理を作る 注⽂をとる 料理を運ぶ

  72. 順次処理

  73. 順次処理 注⽂を取る - 料理を作る - 料理を運ぶ

  74. 順次処理 注⽂を取る - 料理を作る - 料理を運ぶ 完了してから次のタスク

  75. 並列処理

  76. 並列処理 注⽂を取る 料理を作る 料理を運ぶ

  77. 並列処理 注⽂を取る 料理を作る 料理を運ぶ 複数のタスクを同時に着⼿する

  78. 並⾏処理

  79. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ
  80. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio
  81. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio シングルスレッド
  82. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio シングルスレッド = ワンオペ
  83. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio シングルスレッド = ワンオペ 同じ⼈
  84. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔
  85. asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた

  86. asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた お客様

  87. asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた お客様 ←注⽂

  88. asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた 考え中のお客様 ←注⽂待ち

  89. asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた 考え中のお客様 ←注⽂待ち あなたから⾒て、

    外部のお客様、から 注⽂という ⼊⼒を待つ状態
  90. asyncio どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた 考え中のお客様 ←注⽂待ち あなたから⾒て、 外部のお客様、から 注⽂という ⼊⼒を待つ状態

  91. a どのタイミングでタスクの切り替えをするのでしょうか 🤔 あなた 考え中のお客様 ←注⽂待ち あなたから⾒て、 外部のお客様、から 注⽂という ⼊⼒を待つ状態

    ⾮同期IO syncio
  92. a sync io

  93. a sync io ⼊⼒

  94. a sync io 同期 ⼊⼒

  95. a sync io しない 同期 ⼊⼒

  96. asyncio ⾮同期IO

  97. asyncio ⾮同期IO

  98. asyncio ⾮同期IO

  99. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない こわい •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic γϯάϧεϨου ฒߦॲཧ ඇಉظ IO
  100. ฒߦॲཧ asyncioの周辺はちょっとこわくない γϯάϧεϨου ඇಉظ IO

  101. ฒߦॲཧ asyncioの周辺はちょっとこわくない γϯάϧεϨου ඇಉظ IO

  102. ฒߦॲཧ asyncioの周辺はちょっとこわくない γϯάϧεϨου ඇಉظ IO ϫϯΦϖ

  103. ฒߦॲཧ asyncioの周辺はちょっとこわくない γϯάϧεϨου ඇಉظ IO ϫϯΦϖ 外部のお客様、から 注⽂という ⼊⼒を待たないで他のことする

  104. asyncio

  105. asyncio🌷

  106. asyncio で 覚えておくことは3つ asyncio

  107. イベントループ

  108. コルーチン イベントループ

  109. コルーチン イベントループ タスク

  110. コルーチン イベントループ タスク → やること

  111. コルーチン イベントループ タスク → やること → やること+実⾏状態をもつ (コルーチンの上位のやつ)

  112. コルーチン イベントループ タスク → やること → やること+実⾏状態をもつ (コルーチンの上位のやつ) → やることを管理するもの

  113. コルーチン イベントループ タスク → やること → やること+実⾏状態をもつ (コルーチンの上位のやつ) → やることを管理するもの

  114. レストラン

  115. 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ

    注⽂を取る - 料理を作る - 料理を運ぶ asyncio
  116. 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ

    注⽂を取る - 料理を作る - 料理を運ぶ asyncio コルーチンやタスク
  117. asyncio 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ コルーチンやタスク
  118. asyncio 注⽂を取 注⽂を取 注⽂を取 コ

  119. asyncio イベントループ 注⽂を取 注⽂を取 注⽂を取 コ

  120. asyncio イベントループ (あくまでイメージ) 注⽂を取 注⽂を取 注⽂を取 コ

  121. コルーチン イベントループ タスク

  122. コルーチン イベントループ タスク

  123. •ίϧʔνϯͱ͸ɺϧʔνϯʢ޿͍ҙຯͰͷؔ਺ʣͷҰछ コルーチン

  124. •ίϧʔνϯͱ͸ɺϧʔνϯʢ޿͍ҙຯͰͷؔ਺ʣͷҰछ コルーチン •Co-routine ͱॻ͘

  125. •ίϧʔνϯͱ͸ɺϧʔνϯʢ޿͍ҙຯͰͷؔ਺ʣͷҰछ コルーチン •Co-routine ͱॻ͘ •ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ

  126. •ίϧʔνϯͱ͸ɺϧʔνϯʢ޿͍ҙຯͰͷؔ਺ʣͷҰछ コルーチン •Co-routine ͱॻ͘ •ؔ਺ͷఆٛʹ async Λ͚ͭΔ ɺதஅͯ͠࠶։͢Δͱ͜Ζʹ await •ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ

  127. •ίϧʔνϯͱ͸ɺϧʔνϯʢ޿͍ҙຯͰͷؔ਺ʣͷҰछ コルーチン •Co-routine ͱॻ͘ •ؔ਺ͷఆٛʹ async Λ͚ͭΔ ɺதஅͯ͠࠶։͢Δͱ͜Ζʹ await •

    asyncio Λ࢖͏্Ͱͷجຊͷ͖ •ॲཧΛ్தͰதஅͯ͠࠶։Ͱ͖Δϧʔνϯ
  128. 関数を定義 def customers_thinking_order(): ... # ॲཧ

  129. def customers_long_thinking_order(): ... # ࣌ؒͷ͔͔Δॲཧ コルーチンを定義 async •async Λ͚ͭΔ͚ͩ •͍ͭ͜͸ίϧʔνϯؔ਺ʹͳΔ

    •def Ͱఆٛͨؔ͠਺ͱ΄΅มΘΒͳ͍
  130. def customers_long_thinking_order(): await asyncio.sleep(10000) return “͟Δͦ͹” 時間のかかる処理にawait async •࣌ؒͷ͔͔ΔॲཧʹawaitΛ͚ͭΔ •͔ͦ͜Βதஅͱ࠶։͢Δ

    •await Λ͚ͭΔ͜ͱ͕Ͱ͖Δͷ͸ɺίϧʔνϯ΍λεΫʢͳͲʣ
  131. 関数を実⾏ def customers_long_thinking_order(): time.sleep(10000) return “יͦ͹” >>> print(customers_long_thinking_order()) יͦ͹ #

    ௕ߟͷͷͪ
  132. def customers_long_thinking_order(): await asyncio.sleep(10000) return “͟Δͦ͹” コルーチンを実⾏ >>> print(customers_long_thinking_order()) async

  133. def customers_long_thinking_order(): await asyncio.sleep(10000) return “͟Δͦ͹” コルーチンを実⾏ >>> print(customers_long_thinking_order()) async

    <coroutine object customers_long_thinking_order at 0x10d949ec0>
  134. コルーチン イベントループ タスク

  135. asyncio イベントループ 注⽂を取 注⽂を取 注⽂を取 コ (あくまでイメージ)

  136. •C10K໰୊΁ͷճ౴ •libuv(nodejs)ͷத֩Λͳ͢࢓૊Έ イベントループ

  137. •C10K໰୊΁ͷճ౴ •libuv(nodejs)ͷத֩Λͳ͢࢓૊Έ •ίϧʔνϯ΍λεΫΛεέδϡʔϦϯά イベントループ

  138. •C10K໰୊΁ͷճ౴ •libuv(nodejs)ͷத֩Λͳ͢࢓૊Έ •ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷ࢓૊Έ •ίϧʔνϯ΍λεΫΛεέδϡʔϦϯά イベントループ

  139. •C10K໰୊΁ͷճ౴ •libuv(nodejs)ͷத֩Λͳ͢࢓૊Έ •ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷ࢓૊Έ •ͦ͜·Ͱҙࣝ͠ͳͯ͘΋ྑ͍ʢͦ͜ʹ͍Δ͜ͱ͸஌ͬͯͯʣ •ίϧʔνϯ΍λεΫΛεέδϡʔϦϯά イベントループ

  140. •C10K໰୊΁ͷճ౴ •libuv(nodejs)ͷத֩Λͳ͢࢓૊Έ •ڠௐͯ͠ฒߦʹ࣮ߦ͢ΔͨΊͷ࢓૊Έ •ͦ͜·Ͱҙࣝ͠ͳͯ͘΋ྑ͍ʢͦ͜ʹ͍Δ͜ͱ͸஌ͬͯͯʣ •ίϧʔνϯ΍λεΫΛεέδϡʔϦϯά イベントループ •asyncio ͷத֩Λͳ͢࢓૊Έ

  141. •Python 3.7 Ͱ௥Ճ͞Εͨ asyncio.run() イベントループ •ΠϕϯτϧʔϓΛ࡞Δ •λεΫ͕ऴΘͬͨΒ࡟আͯ͘͠ΕΔ •asyncio.run(corutine) Λड͚औΔ͜ͱ͕Ͱ͖Δ

  142. •Python 3.7 Ͱ௥Ճ͞Εͨ asyncio.run() イベントループ •ΠϕϯτϧʔϓΛ࡞Δ •λεΫ͕ऴΘͬͨΒ࡟আͯ͘͠ΕΔ •asyncio.run(corutine) Λड͚औΔ͜ͱ͕Ͱ͖Δ •loopΦϒδΣΫτ

    -> asyncio.get_running_loop() / run_until_complete()
  143. async def customers_long_thinking_order(): print(“ͪΐͬͱ଴ͬͯͶ”) await asyncio.sleep(10000) return “͟Δͦ͹” イベントループを作る

  144. async def customers_long_thinking_order(): print(“ͪΐͬͱ଴ͬͯͶ”) await asyncio.sleep(10000) return “͟Δͦ͹” イベントループを作る async

    def order(): print(“͝஫จ͸ʁ”) menu = await customers_long_thinking_order() print(menu)
  145. イベントループを作る asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ ͝஫จ͸ʁ ͪΐͬͱ଴ͬͯͶ

  146. イベントループを作る ͝஫จ͸ʁ ͪΐͬͱ଴ͬͯͶ # …௕ߟͷͷͪ asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ

  147. イベントループを作る ͝஫จ͸ʁ ͪΐͬͱ଴ͬͯͶ # …௕ߟͷͷͪ ͟Δͦ͹ asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ #

    ίϧʔνϯͷ໭ΓΛड͚औͬͯprint
  148. イベントループを作る ͝஫จ͸ʁ ͪΐͬͱ଴ͬͯͶ # …௕ߟͷͷͪ ͟Δͦ͹ asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ ↑

    ऴΘͬͨΒΠϕϯτϧʔϓ͸ ࡟আ
  149. 考え中のお客様 3⼈とも

  150. 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])
  151. 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 の動作を確認する
  152. 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())
  153. 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
  154. 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())
  155. 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
  156. 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
  157. コルーチン イベントループ タスク

  158. •TaskΦϒδΣΫτ •ίϧʔνϯΛϥοϓ͠ɺ࣮ߦঢ়ଶΛ΋ͭ •࡞Δํ๏͸େ͖͘2ͭ •Python3.7 Ͱ௥Ճ͞Εͨ asyncio.create_task() •Πϕϯτϧʔϓʹొ࿥͢Δ •ฒྻ࣮ߦΛॿ͚Δ gather() タスク

  159. 初めてのタスク 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())
  160. 初めてのタスク 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, “͟Δͦ͹”
  161. 初めてのタスク 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 task1 menu1 = await task2 menu1 = await task3 print([menu1, memu2, menu3]) asyncio.run(order())
  162. 初めてのタスク 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 task1 menu1 = await task2 menu1 = await task3 print([menu1, memu2, menu3]) asyncio.run(order()) 実⾏してみましょう
  163. 初めてのタスク 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 task1 menu2 = await task2 menu3 = await task3 print([menu1, memu2, menu3]) asyncio.run(order()) 実⾏してみましょう ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ <  ͟Δͦ͹   ͟Δͦ͹   ͟Δͦ͹ > UJNF
  164. 初めてのタスク 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 task1 print(menu1) menu2 = await task2 print(menu2) menu3 = await task3 print(menu2) asyncio.run(order()) 実⾏してみましょう
  165. 初めてのタスク 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 task1 print(menu1) menu2 = await task2 print(menu2) menu3 = await task3 print(menu2) asyncio.run(order()) 実⾏してみましょう l͝஫จ͸ʁz ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ  ͟Δͦ͹   ͟Δͦ͹   ͟Δͦ͹  UJNF
  166. 初めてのタスク 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 task1 print(menu1) menu2 = await task2 print(menu2) menu3 = await task3 print(menu2) asyncio.run(order()) 実⾏してみましょう l͝஫จ͸ʁz ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ  ͟Δͦ͹   ͟Δͦ͹   ͟Δͦ͹  UJNF
  167. 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())
  168. 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
  169. 考え中のお客様

  170. 考え中のお客様 検索しないと決 められない

  171. 考え中のお客様 検索しないと決 められない 3⼈とも

  172. 考え中のお客様 検索しないと決 められない 3⼈とも asyncio ⾮同期IO

  173. 考え中のお客様が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)
  174. 考え中のお客様が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
  175. 考え中のお客様が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
  176. 考え中のお客様が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
  177. asyncio イベントループ 注⽂を取 注⽂を取 注⽂を取 コ (あくまでイメージ)

  178. 考え中のお客様が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)
  179. 考え中のお客様が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 ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ ͪΐͬͱ଴ͬͯͶ <  3FTQPOTF<0,> b͟Δͦ͹`  UJNF
  180. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ

  181. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ ؔ਺ʹ async Λ͚ͭΔ͚ͩ ؊͸await

  182. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ ੾ΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ࿥͓ͯ͘͠ͱ ྑ͖ʹܭΒͬͯ੾Γସ͑ͯ͘ΕΔɻ ؔ਺ʹ async Λ͚ͭΔ͚ͩ ؊͸await

  183. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ ੾ΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ࿥͓ͯ͘͠ͱ ྑ͖ʹܭΒͬͯ੾Γସ͑ͯ͘ΕΔɻ 登録してあるタスクを awaitのタイミングで切 り替える。ただし asyncio対応が必要。

    ؔ਺ʹ async Λ͚ͭΔ͚ͩ ؊͸await
  184. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ create_task(coro) - Πϕϯτϧʔϓʹొ࿥ gather(λεΫ ·ͨ͸ ίϧʔνϯ)

    - ·ͱΊͯ݁ՌΛड͚औΕΔ async def hoge() await λεΫ ·ͨ͸ ίϧʔνϯ asynio.run(ίϧʔνϯ) ༨ྗ͕͋Ε͹ɺget_running_loop()ͬͯͷ΋ 🙏
  185. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ create_task(coro) - Πϕϯτϧʔϓʹొ࿥ gather(λεΫ ·ͨ͸ ίϧʔνϯ)

    - ·ͱΊͯ݁ՌΛड͚औΕΔ async def hoge() await λεΫ ·ͨ͸ ίϧʔνϯ asynio.run(ίϧʔνϯ) ༨ྗ͕͋Ε͹ɺget_running_loop()ͬͯͷ΋ 🙏 まずはこれを抑えましょう
  186. わたしたちはいくつかの 武器を⼿に⼊れました。

  187. 注⽂を取る - 料理を 注⽂を取る - 料理を 注⽂を取る - 料理を 並⾏処理

  188. 注⽂を取る 注⽂を取る 注⽂を取る 並⾏処理 ⾮同期IO

  189. 注⽂を取る 注⽂を取る 注⽂を取る 並⾏処理 ⾮同期IO コ asyncio

  190. 注⽂を取る 注⽂を取る 注⽂を取る 並⾏処理 ⾮同期IO コ asyncio ちょっとわがまま

  191. None
  192. 本⽇のおしながき •Django 3.1 - Async View •Django 3.x or 4?

    - Async ORM •ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ
  193. Django 3.2 ASGI対応 Junya Fukuda DjangoCongress JP 2021 -こわくない asyncio

    基礎とasync viewの使い所
  194. Django 3.2 ASGI対応 Junya Fukuda DjangoCongress JP 2021 -こわくない asyncio

    基礎とasync viewの使い所
  195. Django Async View ͷ࢖͍ॴ •ASGIରԠͱasync view

  196. Django Async View ͷ࢖͍ॴ •ASGIରԠͱasync view •asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ

  197. Django Async View ͷ࢖͍ॴ •ASGIରԠͱasync view •asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ

  198. Django Async View ͷ࢖͍ॴ •IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ •ASGIରԠͱasync view •asyncio ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ

  199. Django Async View ͷ࢖͍ॴ •IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ •ྫ͑͹APIͷϦΫΤετ •ྫ͑͹IoTσόΠεͱͷMQTT •ASGIରԠͱasync view •asyncio

    ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ
  200. Django Async View ͷ࢖͍ॴ •IOͷൃੜ͢ΔॲཧͰޮՌΛൃش͢Δ •ྫ͑͹APIͷϦΫΤετ •ྫ͑͹IoTσόΠεͱͷMQTT •ASGIରԠͱasync view •asyncio

    ඇಉظIO ͷྑ͖ͱ͜ΖΛڗडͰ͖Δ •DjangoΛར༻͍ͨ͠৔߹
  201. 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)
  202. 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 ͸͠ͳ͍ͷʁ🤔
  203. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ

  204. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ •஌Βͣ஌Βͣͷ͏ͪʹɻ

  205. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ •஌Βͣ஌Βͣͷ͏ͪʹɻ •ASGI Django ͬͯͲ͏΍࣮ͬͯߦ͠·͔͢ʁ

  206. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ •஌Βͣ஌Βͣͷ͏ͪʹɻ •ASGI Django ͬͯͲ͏΍࣮ͬͯߦ͠·͔͢ʁ $

    uvicorn hello_async_world.asgi:application
  207. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ •஌Βͣ஌Βͣͷ͏ͪʹɻ •ASGI Django ͬͯͲ͏΍࣮ͬͯߦ͠·͔͢ʁ $

    uvicorn hello_async_world.asgi:application •ASGIͰɺPythonͷWebαʔόͱPythonͷWeb FWΛܨ͍ͰΔ
  208. Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ •஌Βͣ஌Βͣͷ͏ͪʹɻ •ASGI Django ͬͯͲ͏΍࣮ͬͯߦ͠·͔͢ʁ $

    uvicorn hello_async_world.asgi:application •ASGIͰɺPythonͷWebαʔόͱPythonͷWeb FWΛܨ͍ͰΔ •ASGIαʔόଆͰΠϕϯτϧʔϓΛ࣮ߦ͍ͯ͠Δ
  209. Django Async View の使い所 •ඇಉظͳॲཧΛߦ͍͍ͨ৔߹ʹ͸ɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ

  210. Django Async View の使い所 •ඇಉظͳॲཧΛߦ͍͍ͨ৔߹ʹ͸ɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ •ͨͩඇಉظͳॲཧͷதʹ΋ɺಉظͷॲཧʢasyncioରԠ͍ͯ͠ͳ͍ʣ͕͍Δ

  211. Django Async View の使い所 •ඇಉظͳॲཧΛߦ͍͍ͨ৔߹ʹ͸ɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ •ͨͩඇಉظͳॲཧͷதʹ΋ɺಉظͷॲཧʢasyncioରԠ͍ͯ͠ͳ͍ʣ͕͍Δ •ಉظॲཧʹ͸ɺDjango͕༻ҙͯ͘͠Ε͍ͯΔಉظॲཧˠඇಉظॲཧʹ͢Δ •sync_to_async()

  212. Django Async View の使い所 •sync_to_async() ಉظؔ਺Λड͚औΓɺͦΕΛϥοϓͯ͠ඇಉظؔ਺Λฦ͠·͢ɻ ௚઀ϥούʔ·ͨ͸σίϨʔλͱͯ͠࢖༻Ͱ͖·͢ɻ

  213. 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_async def sync_function(...): ... IUUQTEPDTEKBOHPQSPKFDUDPNFOUPQJDTBTZODTZODUPBTZOD
  214. Django Async View の使い所 •sync_to_async() asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ࿥͢Δ͜ͱ͕Ͱ͖·͢ɻ ʢDjangoʹݶͬͨ࿩Ͱ͸ͳ͘ʣ

  215. Django Async View の使い所 •sync_to_async() asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ࿥͢Δ͜ͱ͕Ͱ͖·͢ɻ ʢDjangoʹݶͬͨ࿩Ͱ͸ͳ͘ʣ concurrent.futures Ϟδϡʔϧ ʢthreading

    ͱ multiprocessing Λ༰қʹ࢖͑Δඪ४ϥΠϒϥϦʣ
  216. Django Async View の使い所 •sync_to_async() asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ࿥͢Δ͜ͱ͕Ͱ͖·͢ɻ ʢDjangoʹݶͬͨ࿩Ͱ͸ͳ͘ʣ concurrent.futures Ϟδϡʔϧ ʢthreading

    ͱ multiprocessing Λ༰қʹ࢖͑Δඪ४ϥΠϒϥϦʣ ͜ΕͰඇಉظʹͰ͖Δ…ʹ͸Ͱ͖·͕͢ɺ ࣮ߦʹίετ͕͔͔Γ଎౓ʹӨڹ͕ଟগ͋Γ·͢ɻ
  217. Django Async View の使い所 •ASGIରԠͱasync view

  218. Django Async View の使い所 •ASGIରԠͱasync view •͜ΕʹΑͬͯɺDjangoͰ΋asyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ

  219. Django Async View の使い所 •ASGIରԠͱasync view •͜ΕʹΑͬͯɺDjangoͰ΋asyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ •ಉظॲཧ΋ concurrent.futures Λ࢖ͬͨϥοϓ͕Մೳ

  220. Django Async View の使い所 •ASGIରԠͱasync view •͜ΕʹΑͬͯɺDjangoͰ΋asyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ •ಉظॲཧ΋ concurrent.futures Λ࢖ͬͨϥοϓ͕Մೳ

    •·ͩ࢒͍ͬͯΔಉظॲཧ
  221. Django Async View の使い所 •ASGIରԠͱasync view •͜ΕʹΑͬͯɺDjangoͰ΋asyncioʹΑΔඇಉظIO/ฒߦॲཧͷԸܙ •ಉظॲཧ΋ concurrent.futures Λ࢖ͬͨϥοϓ͕Մೳ

    •·ͩ࢒͍ͬͯΔಉظॲཧ •ͦ͏ɻ࠷ޙͷࡆɻDjangoͷORM͕࢒͍ͬͯΔɻʢasyncio ະରԠʣ
  222. None
  223. Async ORM

  224. Node.jsの作成者であるRyan Dahlは尋ねました。

  225. Node.jsの作成者であるRyan Dahlは尋ねました。 「データベースにクエリを実⾏している間、 ソフトウェアは何をしているのですか?」

  226. Node.jsの作成者であるRyan Dahlは尋ねました。 「データベースにクエリを実⾏している間、 ソフトウェアは何をしているのですか?」 https://www.youtube.com/watch?v=ztspvPYybIY もちろん、答えは何もありませんでした。 データベースが応答するのを待っていました。

  227. Django ORM •DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM

  228. Django ORM •DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM •ORM͸asyncioରԠ͍ͯ͠ͳ͍

  229. Django ORM •DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM •ඇಉظIOͷར఺Λ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ •ORM͸asyncioରԠ͍ͯ͠ͳ͍

  230. Django ORM •DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM •ඇಉظIOͷར఺Λ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ •΋ͪΖΜσʔλϕʔε΁ͷΞΫηε΋༗ޮ •ORM͸asyncioରԠ͍ͯ͠ͳ͍

  231. Django ORM •DjangoΛར༻͢Δ্Ͱɺେ͖ͳັྗͷͻͱͭ ORM •ඇಉظIOͷར఺Λ֎෦ͷೖग़ྗͱઆ໌͖ͯ͠·ͨ͠ʢओʹωοτϫʔΫʣ •΋ͪΖΜσʔλϕʔε΁ͷΞΫηε΋༗ޮ •ࠓ͞Θ͍ͬͯΔΞϓϦέʔγϣϯΛࢥ͍ग़͍ͯͩ͘͠͞ɻDB͕ඇಉظʹͳͬͨΒ… •ORM͸asyncioରԠ͍ͯ͠ͳ͍

  232. Async ORM •Async ORM ΁ͷಓ •PyConline AU 2020 "Taking Django's

    ORM Async” •Django ίΞ developer Andrew Godwin ͞Μ
  233. Async ORM •Async ORM ΁ͷಓ •APIͷσβΠϯ͕ॏཁͩ •ͨͩɺasync DBAPI ͸·ͩͳ͍… •՝୊͸͋Δ

    •Model API / ΫΤϦ / DBΞμϓλʔ ͱରԠ͍ͯ͘͠ܭը
  234. Async ORM •Async ORM ΁ͷಓ •ඇಉظΛՄೳͳݶΓ࠷ߴͷ΋ͷʹ͢Δ͜ͱΛ͓఻͑͠·͢ 🎉🎉🎉 •҆શͳඇಉظϓϩάϥϛϯά •͢΂͕ͯඇಉظͰɺඇಉظͰΤϥʔ͕ىͤ͜ͳ͍ੈքΛ࣮ݱ

  235. Async ORM •۩ମతͳόʔδϣϯ͸…΋͏গ͔͔͠Γͦ͏Ͱ͢ •ָ͠ΈͰ͢Ͷ˒ IUUQTGPSVNEKBOHPQSPKFDUDPNUBTZODISPOPVTPSN

  236. まとめ •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔ コ •Django async view - ಉظͱඇಉظ߹Θͤͯ IOό΢ϯυͳॲཧΛத৺ʹ…

    •Async ORM - ָ͠ΈͰ͢Ͷʂ ʢPyhtonͰ͸ asyncio ରԠͷORM΍Ξμϓλʔ΋͢Ͱʹ͍͔ͭ͋͘Γ·͢ɻʣ ·ͨɺDjango͸OSSͰ͢ɻϦϙδτϦΛͷ͍ͧͯΈΔͷ΋ྑ͍͔΋͠Ε·ͤΜ 👀 IUUQTHJUIVCDPNEKBOHPEKBOHP
  237. •ίϧʔνϯ͸ා͘ͳ͍ - 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
  238. ご静聴ありがとうございました 👋