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

こわくないasyncio基礎と非同期IO - 動くコードを添えて

こわくないasyncio基礎と非同期IO - 動くコードを添えて

Pythonで非同期IOを利用する上での asyncio 基礎です。
コードはこちら https://github.com/jrfk/talk/tree/main/stpy

Junya Fukuda

August 19, 2022
Tweet

More Decks by Junya Fukuda

Other Decks in Programming

Transcript

  1. •෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ •WebΤϯδχΞ •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ •ʢ͓͠͝ͱͰʣόϦϡʔϒοΫε

    •ຊ޷͖ʹѪ͞ΕΔαʔϏεΛ໨ࢦͯ͠ʢݹຊങऔɾൢചʣ ΪʔΫϥϘ௕໺ಡॻձ •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ
  2. Python実践 •2022೥1݄ൃച •Python 3 ΤϯδχΞೝఆ࣮ફࢼݧ ओڭࡐ •2࡭໨ʹ͓͢͢Ίʂࣙॻతʹ࢖͍ͬͯ͋͛ͯͩ͘͞ʂ • ҎԼͷষΛ୲౰͍ͯ͠·͢ •

    Chapter2 ίʔσΟϯάن໿ • Chapter5 ܕώϯτ • Chapter19 ฒߦॲཧɼฒྻॲཧ ຊ೔ϓϨθϯτ΋͋Γ·͢ʂʂʂ
  3. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

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

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

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷॳظͷϦϑΝϨϯεత࣮૷ aioquic
  6. •͜Θ͔ͬͨ •Using Asyncio in Python - ΦϥΠϦʔ ʢ🐸ຊʣ asyncio めっちゃこわい

    •2ͭͷग़ձ͍ https://www.oreilly.com/library/view/using-asyncio-in/9781492075325/
  7. •͜Θ͔ͬͨ •ίϧʔνϯ͸ා͘ͳ͍ - Minimum Viable Programmer ʢϒϩάʣ •Using Asyncio in

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

    Python - ΦϥΠϦʔ ʢ🐸ຊʣ asyncio めっちゃこわい •2ͭͷग़ձ͍ •τʔΫ3 ʰFastAPIͬͯԿऀͩΖ͏ʁʱ - ಃࢁ ྮ ͞Μ
  9. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

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

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

    •Python 3.5 Ͱ async/await ߏจ asyncioはこわくない こわい •ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦ •γϯάϧεϨουͰΠϕϯτϧʔϓͰඇಉظ IO •ઌ೔RFCͰඪ४Խ͞ΕͨWebن֨ QUIC ͷϦϑΝϨϯεత࣮૷ aioquic
  12. 並⾏処理 注⽂を取る - 料理を作る - 料理を運ぶ 注⽂を取る - 料理を作る -

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

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

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

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

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

    料理を運ぶ 注⽂を取る - 料理を作る - 料理を運ぶ asyncio シングルスレッド = ワンオペ どのタイミングでタスクの切り替えをするのでしょうか 🤔
  18. •Python 3.4 Ͱ ௥Ճ͞Εͨඪ४ϥΠϒϥϦ •Python 3.6 Ͱ ඇಉظδΣωϨʔλʔ / ඇಉظ಺แදه

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

    注⽂を取る - 料理を作る - 料理を運ぶ asyncio コルーチンやタスク
  20. コードのおさらい - 関数 def order(): print(“͝஫จ͸ʁ”) menu = long_thinking() print(menu)

    def long_thinking(): print(“ͪΐͬͱ଴ͬͯͶ”) sleep(10000) return “͟Δͦ͹” order() # ࣮ߦ͢Δ
  21. コードのおさらい - コルーチン async def order(): print(“͝஫จ͸ʁ”) menu = await

    long_thinking() print(menu) async def long_thinking(): print(“ͪΐͬͱ଴ͬͯͶ”) await asyncio.sleep(10000) return “͟Δͦ͹” asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
  22. コードのおさらい - コルーチン async def order(): print(“͝஫จ͸ʁ”) menu = await

    long_thinking() print(menu) async def long_thinking(): print(“ͪΐͬͱ଴ͬͯͶ”) await asyncio.sleep(10000) return “͟Δͦ͹” asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
  23. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ create_task(ίϧʔνϯ) - Πϕϯτϧʔϓʹొ࿥ gather(λεΫ ·ͨ͸ ίϧʔνϯ)

    - ·ͱΊͯ݁ՌΛड͚औΕΔ async def await λεΫ ·ͨ͸ ίϧʔνϯ asynio.run(ίϧʔνϯ)
  24. ίϧʔνϯ asyncioはこわくない λεΫ Πϕϯτϧʔϓ create_task(ίϧʔνϯ) - Πϕϯτϧʔϓʹొ࿥ gather(λεΫ ·ͨ͸ ίϧʔνϯ)

    - ·ͱΊͯ݁ՌΛड͚औΕΔ async def await λεΫ ·ͨ͸ ίϧʔνϯ asynio.run(ίϧʔνϯ) まずはこれを抑えましょう
  25. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8
  26. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ Yury

    Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ PEP 492 -- Coroutines with async and await syntax ஶऀ
  27. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ Yury

    Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ PEP 492 -- Coroutines with async and await syntax ஶऀ normal ϋʔυίΞ
  28. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ Yury

    Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ PEP 492 -- Coroutines with async and await syntax ஶऀ
  29. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8
  30. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8 Python 3.10 ߴϨϕϧAPI(gather/wait/sleep … ) ͷҾ਺ʹloopΦϒδΣΫτͷࢦఆ͕ෆՄ
  31. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8 Python 3.10 ߴϨϕϧAPI(gather/wait/sleep … ) ͷҾ਺ʹloopΦϒδΣΫτͷࢦఆ͕ෆՄ loopΦϒδΣΫτ΍futureΦϒδΣΫτΛҙࣝͤͣʹasyncioར༻Մೳʹ
  32. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8 Python 3.10 ߴϨϕϧAPI(gather/wait/sleep … ) ͷҾ਺ʹloopΦϒδΣΫτͷࢦఆ͕ෆՄ loopΦϒδΣΫτ΍futureΦϒδΣΫτΛҙࣝͤͣʹasyncioར༻Մೳʹ Ξοϓσʔτ͕଎͍
  33. asyncioはこわくない 緩やかな根拠 Python 3.7 ͷΞοϓσʔτ asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ python

    core developer Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ ͷొஃ PEP 492 -- Coroutines with async and await syntax ஶऀ europython 2018 - Asyncio in Python 3 7 and 3 8 Python 3.10 ߴϨϕϧAPI(gather/wait/sleep … ) ͷҾ਺ʹloopΦϒδΣΫτͷࢦఆ͕ෆՄ loopΦϒδΣΫτ΍futureΦϒδΣΫτΛҙࣝͤͣʹasyncioར༻Մೳʹ Ξοϓσʔτ͕଎͍ ༗༻ͳαϯϓϧίʔυ΋աڈͷόʔδϣϯΛϕʔεʹ͍ͯ͠Δ΋ͷ΋ଟ͍
  34. まとめ •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔ コ •ਐԽͷૣ͍asyncio •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢ •࣮͸3.11Ͱࠓ೔͝঺հͨ͠಺༰͕Ұ෦௠෗Խͯ͠͠·͏͔΋ʁ •PyConJP 2022

    2022.10.14(Fri)-15(Sat) Ͱ͝঺հͰ͖Ε͹ʂͱࢥ͍·͢ •΋ͬͱasyncio΍ଞͷʹ͍ͭͯ஌Γ͍ͨʂ •͓͢͢Ίίϯςϯπͨ͘͞Μ͋Γ·͢ʂʢँࣙγʔτͰʣ
  35. •ίϧʔνϯ͸ා͘ͳ͍ - Minimum Viable Programmer https://www.rhoboro.com/2019/02/09/coroutine-abstract.html •Using Asyncio in Python

    - Oreilly & Associates Inc 謝辞 •Yury Selivanov - Asyncio in Python 3 7 and 3 8 https://www.youtube.com/watch?v=ReXxO_azV-w •asyncioͷTaskʹؔ͢Δجૅ஌ࣝ https://aish.dev/python/20200711_asyncio_task.html •To many many internet articles, great books and member. 🙏
  36. •࣮૷Ͱ஌Δasyncio -Πϕϯτϧʔϓͷਖ਼ମͱ͸ Rei Suyama - PyCon JP 2021 https://www.youtube.com/watch?v=O0Uwz2l_A_Q 謝辞

    •Artisanal Async Adventures Jonas Obrist - PyCon APAC 2018 https://www.youtube.com/watch?v=IbwirUn9ubA •To many many internet articles, great books and member. 🙏 •async await ͷ޲͜͏ଆ Atsushi Odagiri - PyConKyushu 2022 https://www.youtube.com/watch?v=ClSeOPoUH7c