Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

•෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ •WebΤϯδχΞ •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ •Effective Python ͷಡॻձ΍ͬͯ·͢ 📚 •ʢ͓͠͝ͱͰʣόϦϡʔϒοΫε •ຊ޷͖ʹѪ͞ΕΔαʔϏεΛ໨ࢦͯ͠ʢݹຊങऔɾൢചʣ ΪʔΫϥϘ௕໺ಡॻձ

Slide 3

Slide 3 text

こんにちは⻑野!

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

オフラインのひと〜👋

Slide 7

Slide 7 text

オンラインのひと〜👋

Slide 8

Slide 8 text

🙌

Slide 9

Slide 9 text

Django 3.2

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

•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

Slide 13

Slide 13 text

Django 3.0 - ASGI対応 •WebαʔόͱϑϨʔϜϫʔΫΛͭͳ͙ɺ࢓༷ って?

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

WSGI

Slide 19

Slide 19 text

WSGI Web Server Gateway Interface

Slide 20

Slide 20 text

WSGI Web Server Gateway Interface ASGI

Slide 21

Slide 21 text

WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

Slide 22

Slide 22 text

WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

WSGI Web Server Gateway Interface ASGI Asynchronous Server Gateway Interface ⾮同期 ASGI= asyncio

Slide 25

Slide 25 text

•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

Slide 26

Slide 26 text

•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ରԠ

Slide 27

Slide 27 text

本⽇のおしながき •Django 3.1 - Async View ͷ࢖͍ॴ •Django 3.x or 4? - Async ORM •ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ

Slide 28

Slide 28 text

•asyncio͜Θ͍ͳ͋… •Django async view ͬͯͳʹ͕͓͍͍͠ͷʁ •Django ORM ΋͍͚Δͷʁʁ

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

すべてはasync/awaitから始まった

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

asyncioはこわくない

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

asyncio めっちゃこわい

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

•͜Θ͔ͬͨ •ίϧʔνϯ͸ා͘ͳ͍ - Minimum Viable Programmer ʢϒϩάʣ •Using Asyncio in Python - ΦϥΠϦʔ ʢ🐸ຊʣ asyncio めっちゃこわい •2ͭͷग़ձ͍

Slide 44

Slide 44 text

•asyncio ͸௒ڊେ 対象はアプリーケーション開発者

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

⾔葉を完全に理解する

Slide 55

Slide 55 text

IUUQTEPDTQZUIPOPSHKBMJCSBSZBTZODJPIUNM

Slide 56

Slide 56 text

前提知識 並⾏処理

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

並⾏処理 並列処理 順次処理

Slide 61

Slide 61 text

並⾏処理 並列処理 順次処理

Slide 62

Slide 62 text

並⾏処理 並列処理 順次処理

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

レストラン

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

注⽂をとる

Slide 70

Slide 70 text

料理を作る 注⽂をとる

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

順次処理

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

並列処理

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

並⾏処理

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

a sync io

Slide 93

Slide 93 text

a sync io ⼊⼒

Slide 94

Slide 94 text

a sync io 同期 ⼊⼒

Slide 95

Slide 95 text

a sync io しない 同期 ⼊⼒

Slide 96

Slide 96 text

asyncio ⾮同期IO

Slide 97

Slide 97 text

asyncio ⾮同期IO

Slide 98

Slide 98 text

asyncio ⾮同期IO

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

asyncio

Slide 105

Slide 105 text

asyncio🌷

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

イベントループ

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

レストラン

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

asyncio 注⽂を取 注⽂を取 注⽂を取 コ

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

関数を定義 def customers_thinking_order(): ... # ॲཧ

Slide 129

Slide 129 text

def customers_long_thinking_order(): ... # ࣌ؒͷ͔͔Δॲཧ コルーチンを定義 async •async Λ͚ͭΔ͚ͩ •͍ͭ͜͸ίϧʔνϯؔ਺ʹͳΔ •def Ͱఆٛͨؔ͠਺ͱ΄΅มΘΒͳ͍

Slide 130

Slide 130 text

def customers_long_thinking_order(): await asyncio.sleep(10000) return “͟Δͦ͹” 時間のかかる処理にawait async •࣌ؒͷ͔͔ΔॲཧʹawaitΛ͚ͭΔ •͔ͦ͜Βதஅͱ࠶։͢Δ •await Λ͚ͭΔ͜ͱ͕Ͱ͖Δͷ͸ɺίϧʔνϯ΍λεΫʢͳͲʣ

Slide 131

Slide 131 text

関数を実⾏ def customers_long_thinking_order(): time.sleep(10000) return “יͦ͹” >>> print(customers_long_thinking_order()) יͦ͹ # ௕ߟͷͷͪ

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

考え中のお客様 3⼈とも

Slide 150

Slide 150 text

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])

Slide 151

Slide 151 text

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 の動作を確認する

Slide 152

Slide 152 text

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())

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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())

Slide 155

Slide 155 text

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

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

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

Slide 159

Slide 159 text

初めてのタスク 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())

Slide 160

Slide 160 text

初めてのタスク 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, “͟Δͦ͹”

Slide 161

Slide 161 text

初めてのタスク 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())

Slide 162

Slide 162 text

初めてのタスク 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()) 実⾏してみましょう

Slide 163

Slide 163 text

初めてのタスク 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

Slide 164

Slide 164 text

初めてのタスク 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()) 実⾏してみましょう

Slide 165

Slide 165 text

初めてのタスク 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

Slide 166

Slide 166 text

初めてのタスク 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

Slide 167

Slide 167 text

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())

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

考え中のお客様

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

考え中のお客様が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)

Slide 174

Slide 174 text

考え中のお客様が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

Slide 175

Slide 175 text

考え中のお客様が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

Slide 176

Slide 176 text

考え中のお客様が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

Slide 177

Slide 177 text

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

Slide 178

Slide 178 text

考え中のお客様が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)

Slide 179

Slide 179 text

考え中のお客様が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

Slide 180

Slide 180 text

ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ

Slide 181

Slide 181 text

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

Slide 182

Slide 182 text

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

Slide 183

Slide 183 text

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

Slide 184

Slide 184 text

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

Slide 185

Slide 185 text

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

Slide 186

Slide 186 text

わたしたちはいくつかの 武器を⼿に⼊れました。

Slide 187

Slide 187 text

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

Slide 188

Slide 188 text

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

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

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

Slide 191

Slide 191 text

No content

Slide 192

Slide 192 text

本⽇のおしながき •Django 3.1 - Async View •Django 3.x or 4? - Async ORM •ASGI Λར༻͢Δ্Ͱඞཁͳ asyncio جૅ

Slide 193

Slide 193 text

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

Slide 194

Slide 194 text

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

Slide 195

Slide 195 text

Django Async View ͷ࢖͍ॴ •ASGIରԠͱasync view

Slide 196

Slide 196 text

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

Slide 197

Slide 197 text

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

Slide 198

Slide 198 text

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

Slide 199

Slide 199 text

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

Slide 200

Slide 200 text

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

Slide 201

Slide 201 text

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)

Slide 202

Slide 202 text

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 ͸͠ͳ͍ͷʁ🤔

Slide 203

Slide 203 text

Django Async View の使い所 •Έͳ͞Μ΋͏ͯ͠·͢ɻ

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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

Slide 206

Slide 206 text

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

Slide 207

Slide 207 text

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

Slide 208

Slide 208 text

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

Slide 209

Slide 209 text

Django Async View の使い所 •ඇಉظͳॲཧΛߦ͍͍ͨ৔߹ʹ͸ɺASGIΞϓϦͱ࣮ͯ͠ߦ͢Δ

Slide 210

Slide 210 text

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

Slide 211

Slide 211 text

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

Slide 212

Slide 212 text

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

Slide 213

Slide 213 text

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

Slide 214

Slide 214 text

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

Slide 215

Slide 215 text

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

Slide 216

Slide 216 text

Django Async View の使い所 •sync_to_async() asyncioରԠ͍ͯ͠ͳ͍ಉظॲཧΛΠϕϯτϧʔϓʹొ࿥͢Δ͜ͱ͕Ͱ͖·͢ɻ ʢDjangoʹݶͬͨ࿩Ͱ͸ͳ͘ʣ concurrent.futures Ϟδϡʔϧ ʢthreading ͱ multiprocessing Λ༰қʹ࢖͑Δඪ४ϥΠϒϥϦʣ ͜ΕͰඇಉظʹͰ͖Δ…ʹ͸Ͱ͖·͕͢ɺ ࣮ߦʹίετ͕͔͔Γ଎౓ʹӨڹ͕ଟগ͋Γ·͢ɻ

Slide 217

Slide 217 text

Django Async View の使い所 •ASGIରԠͱasync view

Slide 218

Slide 218 text

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

Slide 219

Slide 219 text

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

Slide 220

Slide 220 text

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

Slide 221

Slide 221 text

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

Slide 222

Slide 222 text

No content

Slide 223

Slide 223 text

Async ORM

Slide 224

Slide 224 text

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

Slide 225

Slide 225 text

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

Slide 226

Slide 226 text

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

Slide 227

Slide 227 text

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

Slide 228

Slide 228 text

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

Slide 229

Slide 229 text

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

Slide 230

Slide 230 text

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

Slide 231

Slide 231 text

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

Slide 232

Slide 232 text

Async ORM •Async ORM ΁ͷಓ •PyConline AU 2020 "Taking Django's ORM Async” •Django ίΞ developer Andrew Godwin ͞Μ

Slide 233

Slide 233 text

Async ORM •Async ORM ΁ͷಓ •APIͷσβΠϯ͕ॏཁͩ •ͨͩɺasync DBAPI ͸·ͩͳ͍… •՝୊͸͋Δ •Model API / ΫΤϦ / DBΞμϓλʔ ͱରԠ͍ͯ͘͠ܭը

Slide 234

Slide 234 text

Async ORM •Async ORM ΁ͷಓ •ඇಉظΛՄೳͳݶΓ࠷ߴͷ΋ͷʹ͢Δ͜ͱΛ͓఻͑͠·͢ 🎉🎉🎉 •҆શͳඇಉظϓϩάϥϛϯά •͢΂͕ͯඇಉظͰɺඇಉظͰΤϥʔ͕ىͤ͜ͳ͍ੈքΛ࣮ݱ

Slide 235

Slide 235 text

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

Slide 236

Slide 236 text

まとめ •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔ コ •Django async view - ಉظͱඇಉظ߹Θͤͯ IOό΢ϯυͳॲཧΛத৺ʹ… •Async ORM - ָ͠ΈͰ͢Ͷʂ ʢPyhtonͰ͸ asyncio ରԠͷORM΍Ξμϓλʔ΋͢Ͱʹ͍͔ͭ͋͘Γ·͢ɻʣ ·ͨɺDjango͸OSSͰ͢ɻϦϙδτϦΛͷ͍ͧͯΈΔͷ΋ྑ͍͔΋͠Ε·ͤΜ 👀 IUUQTHJUIVCDPNEKBOHPEKBOHP

Slide 237

Slide 237 text

•ίϧʔνϯ͸ා͘ͳ͍ - 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

Slide 238

Slide 238 text

ご静聴ありがとうございました 👋