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. こわくないasyncio基礎と⾮同期IO
    Junya Fukuda
    ΈΜͳͷPythonษڧձ #84
    動くコードを添えて

    View Slide

  2. •෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ


    •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ


    •WebΤϯδχΞ


    •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ


    •ʢ͓͠͝ͱͰʣόϦϡʔϒοΫε


    •ຊ޷͖ʹѪ͞ΕΔαʔϏεΛ໨ࢦͯ͠ʢݹຊങऔɾൢചʣ
    ΪʔΫϥϘ௕໺ಡॻձ
    •GEEKLAB.NAGANO - ίϛϡχςΟεϖʔεӡӦ

    View Slide

  3. Python実践
    •2022೥1݄ൃച ٕज़ධ࿦ࣾ


    •Python 3 ΤϯδχΞೝఆ࣮ફࢼݧ ओڭࡐ


    •2࡭໨ʹ͓͢͢Ίʂࣙॻతʹ࢖͍ͬͯ͋͛ͯͩ͘͞ʂ
    • ҎԼͷষΛ୲౰͍ͯ͠·͢


    • Chapter2 ίʔσΟϯάن໿


    • Chapter5 ܕώϯτ


    • Chapter19 ฒߦॲཧɼฒྻॲཧ

    View Slide

  4. Python実践
    •2022೥1݄ൃച


    •Python 3 ΤϯδχΞೝఆ࣮ફࢼݧ ओڭࡐ


    •2࡭໨ʹ͓͢͢Ίʂࣙॻతʹ࢖͍ͬͯ͋͛ͯͩ͘͞ʂ
    • ҎԼͷষΛ୲౰͍ͯ͠·͢


    • Chapter2 ίʔσΟϯάن໿


    • Chapter5 ܕώϯτ


    • Chapter19 ฒߦॲཧɼฒྻॲཧ
    ຊ೔ϓϨθϯτ΋͋Γ·͢ʂʂʂ

    View Slide

  5. Python Monthly Topics Web連載
    •ٕज़ධ࿦ࣾ - gihyo.jp


    •ஶऀͷ༗ࢤͰ


    •ຖ݄Pythonʹؔ͢ΔτϐοΫΛ࿈ࡌ

    View Slide

  6. みなさんPythonで
    Webやっていますか?✋

    View Slide

  7. JetBrains 2021年の調査
    https://www.jetbrains.com/ja-jp/lp/devecosystem-2021/python/

    View Slide

  8. JetBrains 2021年の調査
    https://www.jetbrains.com/ja-jp/lp/devecosystem-2021/python/

    View Slide

  9. JetBrains 2021年の調査
    https://www.jetbrains.com/ja-jp/lp/devecosystem-2021/python/
    ิ଍ɿ2020೥ͷ݁Ռ
    FastAPI͸ͳ͔ͬͨ

    View Slide

  10. JetBrains 2021年の調査
    https://www.jetbrains.com/ja-jp/lp/devecosystem-2021/python/

    View Slide

  11. Pythonで⾮同期IOと
    いえば?

    View Slide

  12. asyncio

    View Slide

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

    View Slide

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

    View Slide

  15. asyncioはこわくない

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. asyncio めっちゃこわい

    View Slide

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

    View Slide

  24. •͜Θ͔ͬͨ
    •Using Asyncio in Python - ΦϥΠϦʔ ʢ🐸ຊʣ
    asyncio めっちゃこわい
    •2ͭͷग़ձ͍
    https://www.oreilly.com/library/view/using-asyncio-in/9781492075325/

    View Slide

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

    View Slide

  26. •͜Θ͔ͬͨ
    •ίϧʔνϯ͸ා͘ͳ͍ - Minimum Viable Programmer ʢϒϩάʣ
    •Using Asyncio in Python - ΦϥΠϦʔ ʢ🐸ຊʣ
    asyncio めっちゃこわい
    •2ͭͷग़ձ͍
    •τʔΫ3 ʰFastAPIͬͯԿऀͩΖ͏ʁʱ - ಃࢁ ྮ ͞Μ

    View Slide

  27. View Slide

  28. •asyncio͜Θ͍ͳ͋…

    View Slide

  29. •asyncio͜Θ͍ͳ͋…
    •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋ 👋

    View Slide

  30. •asyncio͜Θ͍ͳ͋…
    •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋ 👋
    •τʔΫ̎ Django /τʔΫ̏FastAPI ϫΫϫΫʂ

    View Slide

  31. •asyncio͜Θ͍ͳ͋…
    •asyncio ͪΐͬͱා͘ͳ͘ͳ͔ͬͨ΋ 👋
    •τʔΫ̎ Django /τʔΫ̏FastAPI ϫΫϫΫʂ

    View Slide

  32. 本⽇のおしながき(話すこと)
    •PythonͰඇಉظIOΛར༻͢Δ্Ͱͷ asyncio جૅ

    View Slide

  33. 本⽇のおしながき(話すこと)
    •࣮ࡍʹಈ͘ίʔυΛݟͳ͕Βʂʢ؆୯ͳϥΠϒίʔσΟϯά͠·͢ʣ
    •PythonͰඇಉظIOΛར༻͢Δ্Ͱͷ asyncio جૅ

    View Slide

  34. 本⽇のおしながき(話すこと)
    •࣮ࡍʹಈ͘ίʔυΛݟͳ͕Βʂʢ؆୯ͳϥΠϒίʔσΟϯά͠·͢ʣ
    •PythonͰඇಉظIOΛར༻͢Δ্Ͱͷ asyncio جૅ
    •GitHubʹίʔυ΋͋Γ·͢ʂ

    View Slide

  35. 本⽇のおしながき(話すこと)
    •࣮ࡍʹಈ͘ίʔυΛݟͳ͕Βʂʢ؆୯ͳϥΠϒίʔσΟϯά͠·͢ʣ
    •PythonͰඇಉظIOΛར༻͢Δ্Ͱͷ asyncio جૅ
    •GitHubʹίʔυ΋͋Γ·͢ʂ
    •Έͳ͞Μ΋ͥͻ͓खݩͰಈ͔͠ͳ͕Βʂ
    •https://github.com/jrfk/talk/tree/main/stpy

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. ⾔葉を完全に理解する

    View Slide

  47. IUUQTEPDTQZUIPOPSHKBMJCSBSZBTZODJPIUNM

    View Slide

  48. 前提知識
    並⾏処理

    View Slide

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

    View Slide

  50. 前提知識
    並⾏処理
    並列処理
    逐次処理

    View Slide

  51. 前提知識
    並⾏処理
    並列処理
    逐次処理
    タスクの処理

    View Slide

  52. 前提知識
    並⾏処理
    concurrent processing

    View Slide

  53. 前提知識
    並⾏処理
    concurrent processing
    複数の処理を同時に実⾏するという意味

    View Slide

  54. 前提知識
    並⾏処理
    concurrent processing
    複数の処理を同時に実⾏するという意味
    イメージ重視

    View Slide

  55. 前提知識
    並⾏処理
    ฒߦॲཧͱͦͷ۩ମతͳॲཧํࣜͷͭͰ͋Δฒྻॲཧ͸ɺ
    ιϑτ΢ΣΞ޻ֶͷ෼໺ʹ͓͍ͯ΋ͬͱ΋෯޿͍τϐοΫͷͭͰ͢ɻ
    ਺े࡭ͷຊΛ΋ͬͯͯ͠΋ɺฒߦॲཧʹ͓͍ͯॏཁͳϙΠϯτ΍
    ฒߦॲཧϞσϧʹؔͯ͠े෼ͳٞ࿦͸Ͱ͖ͳ͍Ͱ͠ΐ͏ɻ
    https://www.kadokawa.co.jp/product/302105001236/
    ΤΩεύʔτ1ZUIPOϓϩάϥϛϯάվగ൛
    ൃച

    View Slide

  56. 前提知識
    並⾏処理
    https://www.oreilly.co.jp/books/9784873119595/
    並⾏コンピューティング技法
    ――実践マルチコア/マルチスレッドプログラミング
    並⾏プログラミング⼊⾨
    ――Rust、C、アセンブリによる実装からのアプローチ
    https://www.oreilly.co.jp/books/9784873114354/

    View Slide

  57. イメージ重視

    View Slide

  58. 並⾏処理
    並列処理
    逐次処理

    View Slide

  59. 並⾏処理
    並列処理
    逐次処理

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  65. レストラン

    View Slide

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

    View Slide

  67. 注⽂をとる

    View Slide

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

    View Slide

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

    View Slide

  70. 逐次処理

    View Slide

  71. 注⽂を取る - 料理を作る - 料理を運ぶ
    逐次処理

    View Slide

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

    View Slide

  73. 並列処理

    View Slide

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

    View Slide

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

    View Slide

  76. 並⾏処理

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  90. a sync io

    View Slide

  91. a sync io
    ⼊⼒

    View Slide

  92. a sync io
    同期 ⼊⼒

    View Slide

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

    View Slide

  94. asyncio
    ⾮同期IO

    View Slide

  95. asyncio
    ⾮同期IO

    View Slide

  96. asyncio
    ⾮同期IO
    プログラムでいう外部の⼊⼒

    View Slide

  97. asyncio
    ⾮同期IO
    プログラムでいう外部の⼊⼒
    “ネットワークやデータベースへの⼊出⼒”

    View Slide

  98. asyncio
    ⾮同期IO
    プログラムでいう外部の⼊⼒
    “ネットワークやデータベースへの⼊出⼒”
    I/Oバウンドな処理

    View Slide

  99. asyncio
    ⾮同期IO
    プログラムでいう外部の⼊⼒
    “ネットワークやデータベースへの⼊出⼒”
    I/Oバウンドな処理 asyncioの得意なこと

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  105. ฒߦॲཧ
    asyncioの周辺はちょっとこわくない
    γϯάϧεϨου
    ඇಉظ IO
    ϫϯΦϖ
    外部のお客様、から
    注⽂という
    ⼊⼒待ちの間に他のことをする
    得意なのはI/Oバウンド(ネットワークやDBの⼊出⼒)

    View Slide

  106. asyncio

    View Slide

  107. asyncio🌷

    View Slide

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

    View Slide

  109. イベントループ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  113. コルーチン
    イベントループ
    タスク
    → やること
    → やること+実⾏状態をもつ

    View Slide

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

    View Slide

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

    View Slide

  116. レストラン

    View Slide

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

    View Slide

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

    View Slide

  119. asyncio
    注⽂を取 注⽂を取 注⽂を取

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  124. 考え中のお客様

    View Slide

  125. 考え中のお客様
    •஫จΛฉ͖ʹ͍͘
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ

    View Slide

  126. asyncioは怖くない

    View Slide

  127. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない

    View Slide

  128. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡

    View Slide

  129. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡

    View Slide

  130. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏

    View Slide

  131. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏
    •ίϧʔνϯͷϧʔϧ͸2ͭ

    View Slide

  132. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏
    •ؔ਺ͷఆٛʢdefʣͷલʹ async Λ͚ͭΔ
    •ίϧʔνϯͷϧʔϧ͸2ͭ

    View Slide

  133. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏
    •ؔ਺ͷఆٛʢdefʣͷલʹ async Λ͚ͭΔ
    •ίϧʔνϯΛݺͼग़͢৔߹ʹ͸ await Λ͚ͭΔ
    •ίϧʔνϯͷϧʔϧ͸2ͭ

    View Slide

  134. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ
    •஫จΛฉ͖ʹ͍͘
    •ཁ݅͸̎ͭ

    View Slide

  135. •ා͘ͳ͍ϙΠϯτͦͷ̍
    asyncioは怖くない
    •async/await ͕͍͍ͭͯͯ΋ɺ௨ৗͷؔ਺ͷॲཧͱ͍͍ͩͨಉ͡
    •·ͣ͸ஞ࣍ॲཧͰίʔυΛॻ͍ͯɺͦΕΛίϧʔνϯʹͯ͠Έ·͠ΐ͏
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ
    •஫จΛฉ͖ʹ͍͘
    •ཁ݅͸̎ͭ

    View Slide

  136. では定義してみましょう

    View Slide

  137. コルーチンわかったこと
    ίϧʔνϯͷఆٛ͸asyncΛ͚ͭΔ͚ͩ
    ͨͩݺͼग़͚ͩ͢Ͱ͸݁ՌΛड͚औΕͳ͍

    View Slide

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

    View Slide

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

    (あくまでイメージ)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  145. asyncio.run()を使ってみましょう
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ
    •஫จΛฉ͖ʹ͍͘
    •ཁ݅͸̎ͭ

    View Slide

  146. コードを⾒⽐べてみましょう

    View Slide

  147. コードのおさらい - 関数
    def order():


    print(“͝஫จ͸ʁ”)


    menu = long_thinking()


    print(menu)
    def long_thinking():


    print(“ͪΐͬͱ଴ͬͯͶ”)


    sleep(10000)


    return “͟Δͦ͹”
    order() # ࣮ߦ͢Δ

    View Slide

  148. コードのおさらい - コルーチン
    async def order():


    print(“͝஫จ͸ʁ”)


    menu = await long_thinking()


    print(menu)
    async def long_thinking():


    print(“ͪΐͬͱ଴ͬͯͶ”)


    await asyncio.sleep(10000)


    return “͟Δͦ͹”
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ

    View Slide

  149. コードのおさらい - コルーチン
    async def order():


    print(“͝஫จ͸ʁ”)


    menu = await long_thinking()


    print(menu)
    async def long_thinking():


    print(“ͪΐͬͱ଴ͬͯͶ”)


    await asyncio.sleep(10000)


    return “͟Δͦ͹”
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ

    View Slide

  150. イベントループ
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
    •࣮͸͜ΕɺWebͰར༻͢Δ৔߹ʹॻ͘͜ͱ͕ͳ͍৔߹΋͋Δ

    View Slide

  151. イベントループ
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
    •࣮͸͜ΕɺWebͰར༻͢Δ৔߹ʹॻ͘͜ͱ͕ͳ͍৔߹΋͋Δ
    •ࠓ೔ग़ͯ͘ΔϑϨʔϜϫʔΫͰʢDjango΍FastAPIʣ͸ASGIରԠ

    View Slide

  152. イベントループ
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
    •࣮͸͜ΕɺWebͰར༻͢Δ৔߹ʹॻ͘͜ͱ͕ͳ͍৔߹΋͋Δ
    •ࠓ೔ग़ͯ͘ΔϑϨʔϜϫʔΫͰʢDjango΍FastAPIʣ͸ASGIରԠ
    •σϓϩΠ͸UvicornͳͲͷαʔό࢖͍·͢ΑͶ

    View Slide

  153. イベントループ
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
    •࣮͸͜ΕɺWebͰར༻͢Δ৔߹ʹॻ͘͜ͱ͕ͳ͍৔߹΋͋Δ
    •ࠓ೔ग़ͯ͘ΔϑϨʔϜϫʔΫͰʢDjango΍FastAPIʣ͸ASGIରԠ
    $ uvicorn example:app
    •σϓϩΠ͸UvicornͳͲͷαʔό࢖͍·͢ΑͶ

    View Slide

  154. イベントループ
    asyncio.run(order()) # ΠϕϯτϧʔϓΛ࡞Δ
    •UvicornͳͲͷWebαʔό͕಺෦Ͱ࣮ߦͯ͘͠Ε͍ͯ·͢


    •ͨͩɺͦ͜ʹΠϕϯτϧʔϓ͕͍Δ͜ͱ͸ೝ͓͍ࣝͯͯ͠΄͍͠
    workers.py L82
    server.py L58

    View Slide

  155. ここまでのまとめ
    ίϧʔνϯͷఆٛ͸asyncΛ͚ͭΔ͚ͩ

    View Slide

  156. ここまでのまとめ
    ίϧʔνϯͷఆٛ͸asyncΛ͚ͭΔ͚ͩ
    ΠϕϯτϧʔϓͰ࣮ߦ͢Δඞཁ͕͋Δ

    View Slide

  157. ここまでのまとめ
    ίϧʔνϯͷఆٛ͸asyncΛ͚ͭΔ͚ͩ
    ΠϕϯτϧʔϓͰ࣮ߦ͢Δඞཁ͕͋Δ
    async/await͕͍͍ͭͯͯ΋ɺஞ࣍ॲཧͱجຊͷྲྀΕ͸มΘ
    Βͳ͍
    ݁ՌΛ଴ͬͯɺ࣍ͷߦͷίʔυ͕࣮ߦ͞ΕΔ

    View Slide

  158. 次に並⾏処理にしてみましょう

    View Slide

  159. 考え中のお客様 3⼈とも

    View Slide

  160. 考え中のお客様 3⼈とも
    どうせ待つなら同時に
    聞いてしまいたい…

    View Slide

  161. 考え中のお客様 3⼈とも
    どうせ待つなら同時に
    聞いてしまいたい…
    •஫จΛฉ͖ʹ͍͘
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ

    View Slide

  162. 考え中のお客様 3⼈とも
    どうせ待つなら同時に
    聞いてしまいたい…
    •஫จΛฉ͖ʹ͍͘
    •͓٬༷͕೰ΜͰɺɺ஫จΛ͢Δ
    •ಉ࣌ʹฉ͘

    View Slide

  163. 先ほどのコードをもとに
    お客様に3回聞いてみましょう

    View Slide

  164. ここまでのまとめ
    ͨͩɺawait͢Δ͚ͩͰ͸ฒߦʹͳΒͳ͍

    View Slide

  165. ここまでのまとめ
    ͨͩɺawait͢Δ͚ͩͰ͸ฒߦʹͳΒͳ͍
    1つのコルーチンが終わってから次のコルーチン
    普通の関数実⾏と同じ

    View Slide

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

    View Slide

  167. •TaskΦϒδΣΫτ
    タスク

    View Slide

  168. •TaskΦϒδΣΫτ
    •ίϧʔνϯΛϥοϓ͠ɺ࣮ߦঢ়ଶΛ΋ͭ
    タスク

    View Slide

  169. •TaskΦϒδΣΫτ
    •ίϧʔνϯΛϥοϓ͠ɺ࣮ߦঢ়ଶΛ΋ͭ
    •Πϕϯτϧʔϓʹొ࿥͢Δ
    タスク

    View Slide

  170. •TaskΦϒδΣΫτ
    •ίϧʔνϯΛϥοϓ͠ɺ࣮ߦঢ়ଶΛ΋ͭ
    •࡞Δํ๏Ͱɺ·֮ͣ͑Δͷ͸2ͭ
    •Πϕϯτϧʔϓʹొ࿥͢Δ
    タスク

    View Slide

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

    View Slide

  172. タスクを作ってみましょう

    View Slide

  173. ここまでのまとめ
    タスクはただ作っただけでは実⾏されない

    View Slide

  174. ここまでのまとめ
    await ͢Δඞཁ͕͋Δ
    タスクはただ作っただけでは実⾏されない

    View Slide

  175. ここまでのまとめ
    await ͢Δඞཁ͕͋Δ
    タスクはただ作っただけでは実⾏されない
    awaitは中断と再開のキーとなる

    View Slide

  176. ここまでのまとめ
    await ͢Δඞཁ͕͋Δ
    タスクはただ作っただけでは実⾏されない
    awaitは中断と再開のキーとなる
    awaitΛΩʔʹΠϕϯτϧʔϓ͕λεΫΛ੾Γସ͑ɺ
    ॲཧΛฒߦʹ͢Δʂ
    gatherは便利

    View Slide

  177. asyncio
    ⾮同期IO

    View Slide

  178. シンプルな asyncio のサンプル
    async def long_thinking():


    print(“ͪΐͬͱ଴ͬͯͶ”)


    await asyncio.sleep(10000)


    return “͟Δͦ͹”

    View Slide

  179. シンプルな asyncio のサンプル
    async def long_thinking():


    print(“ͪΐͬͱ଴ͬͯͶ”)


    await asyncio.sleep(10000)


    return “͟Δͦ͹”
    asyncio.sleep(10000)

    View Slide

  180. ⾮同期IO - asyncio
    asyncio.sleep(10000)

    View Slide

  181. ⾮同期IO - asyncio
    asyncio.sleep(10000)
    外部⼊⼒を待つ状態

    View Slide

  182. ⾮同期IO - asyncio
    asyncio.sleep(10000)
    外部⼊⼒を待つ状態
    •I/Oό΢ϯυ

    View Slide

  183. ⾮同期IO - asyncio
    •I/Oό΢ϯυ
    •σʔλϕʔε΁ͷ઀ଓ
    •WebAPIͷར༻ʹΑΔHTTPϦΫΤετ

    View Slide

  184. 考え中のお客様
    asyncio.sleep(10000)

    View Slide

  185. 考え中のお客様
    検索しないと決められない
    asyncio.sleep(10000)

    View Slide

  186. 考え中のお客様
    検索しないと決められない
    asyncio.sleep(10000) 3⼈とも

    View Slide

  187. 考え中のお客様
    検索しないと決められない
    asyncio.sleep(10000)
    HTTP通信 I/Oバウンド
    3⼈とも

    View Slide

  188. 考え中のお客様
    検索しないと決められない
    asyncio.sleep(10000)
    HTTP通信 I/Oバウンド
    3⼈とも
    requests

    View Slide

  189. 外部I/Oのある処理を書いてみましょう

    View Slide

  190. ここまでのまとめ
    asyncioでHTTP通信をするにはrequestsではだめ

    View Slide

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

    (あくまでイメージ)

    View Slide

  192. 外部I/Oのある処理を書いてみましょう

    View Slide

  193. 外部I/Oのある処理を書いてみましょう
    asyncio対応のライブラリで

    View Slide

  194. ここまでのまとめ
    asyncioでHTTP通信をするにはrequestsではだめ
    asyncioରԠͷϥΠϒϥϦͰɺI/O͢Δඞཁ͕͋Δ

    View Slide

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

    View Slide

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

    View Slide

  197. ίϧʔνϯ
    asyncioはこわくない
    λεΫ
    Πϕϯτϧʔϓ
    ੾ΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ࿥͓ͯ͘͠ͱ


    ྑ͖ʹܭΒͬͯ੾Γସ͑ͯ͘ΕΔɻ
    ؔ਺ʹ async Λ͚ͭΔ͚ͩ ؊͸await

    View Slide

  198. ίϧʔνϯ
    asyncioはこわくない
    λεΫ
    Πϕϯτϧʔϓ
    ੾ΓସΘΔઌͷίϧʔνϯɻΠϕϯτϧʔϓʹొ࿥͓ͯ͘͠ͱ


    ྑ͖ʹܭΒͬͯ੾Γସ͑ͯ͘ΕΔɻ
    登録してあるタスクをawait
    のタイミングで切り替える。
    ただしasyncio対応が必要。
    ؔ਺ʹ async Λ͚ͭΔ͚ͩ ؊͸await

    View Slide

  199. ίϧʔνϯ
    asyncioはこわくない
    λεΫ
    Πϕϯτϧʔϓ
    create_task(ίϧʔνϯ) - Πϕϯτϧʔϓʹొ࿥


    gather(λεΫ ·ͨ͸ ίϧʔνϯ) - ·ͱΊͯ݁ՌΛड͚औΕΔ
    async def


    await λεΫ ·ͨ͸ ίϧʔνϯ
    asynio.run(ίϧʔνϯ)

    View Slide

  200. ίϧʔνϯ
    asyncioはこわくない
    λεΫ
    Πϕϯτϧʔϓ
    create_task(ίϧʔνϯ) - Πϕϯτϧʔϓʹొ࿥


    gather(λεΫ ·ͨ͸ ίϧʔνϯ) - ·ͱΊͯ݁ՌΛड͚औΕΔ
    async def


    await λεΫ ·ͨ͸ ίϧʔνϯ
    asynio.run(ίϧʔνϯ)
    まずはこれを抑えましょう

    View Slide

  201. asyncioはこわくない
    Πϕϯτϧʔϓ loopΦϒδΣΫτ
    触れてないもの

    View Slide

  202. asyncioはこわくない
    Πϕϯτϧʔϓ
    触れてないもの
    futureΦϒδΣΫτ
    loopΦϒδΣΫτ

    View Slide

  203. asyncioはこわくない
    Πϕϯτϧʔϓ
    触れてないもの
    futureΦϒδΣΫτ
    loopΦϒδΣΫτ
    ެࣜυΩϡϝϯτɿ௿ϨϕϧAPIʹ෼ྨ

    View Slide

  204. asyncioはこわくない 緩やかな根拠
    Python 3.7 ͷΞοϓσʔτ

    View Slide

  205. asyncioはこわくない 緩やかな根拠
    Python 3.7 ͷΞοϓσʔτ
    asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ

    View Slide

  206. 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

    View Slide

  207. asyncioはこわくない 緩やかな根拠
    Python 3.7 ͷΞοϓσʔτ
    asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ
    Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ


    PEP 492 -- Coroutines with async and await syntax ஶऀ

    View Slide

  208. asyncioはこわくない 緩やかな根拠
    Python 3.7 ͷΞοϓσʔτ
    asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ
    Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ


    PEP 492 -- Coroutines with async and await syntax ஶऀ
    normal
    ϋʔυίΞ

    View Slide

  209. asyncioはこわくない 緩やかな根拠
    Python 3.7 ͷΞοϓσʔτ
    asyncio.create_task(), asyncio.gather(), asyncio.run() ͷ௥Ճ
    Yury Selivanov ʢϢʔϦʔηϦόϊϑʣࢯ


    PEP 492 -- Coroutines with async and await syntax ஶऀ

    View Slide

  210. 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

    View Slide

  211. 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ΦϒδΣΫτͷࢦఆ͕ෆՄ

    View Slide

  212. 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ར༻Մೳʹ

    View Slide

  213. 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ར༻Մೳʹ Ξοϓσʔτ͕଎͍

    View Slide

  214. 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ར༻Մೳʹ Ξοϓσʔτ͕଎͍
    ༗༻ͳαϯϓϧίʔυ΋աڈͷόʔδϣϯΛϕʔεʹ͍ͯ͠Δ΋ͷ΋ଟ͍

    View Slide

  215. asyncioの話まとめ

    View Slide

  216. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    View Slide

  217. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢

    View Slide

  218. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •ਐԽͷૣ͍asyncio
    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢

    View Slide

  219. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •ਐԽͷૣ͍asyncio
    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢
    •࣮͸3.11Ͱࠓ೔͝঺հͨ͠಺༰͕Ұ෦௠෗Խͯ͠͠·͏͔΋ʁ

    View Slide

  220. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •ਐԽͷૣ͍asyncio
    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢
    •࣮͸3.11Ͱࠓ೔͝঺հͨ͠಺༰͕Ұ෦௠෗Խͯ͠͠·͏͔΋ʁ
    •PyConJP 2022 2022.10.14(Fri)-15(Sat) Ͱ͝঺հͰ͖Ε͹ʂͱࢥ͍·͢

    View Slide

  221. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •ਐԽͷૣ͍asyncio
    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢
    •࣮͸3.11Ͱࠓ೔͝঺հͨ͠಺༰͕Ұ෦௠෗Խͯ͠͠·͏͔΋ʁ
    •PyConJP 2022 2022.10.14(Fri)-15(Sat) Ͱ͝঺հͰ͖Ε͹ʂͱࢥ͍·͢
    •΋ͬͱasyncio΍ଞͷʹ͍ͭͯ஌Γ͍ͨʂ

    View Slide

  222. まとめ
    •asyncio ଟগ͜Θ͘ͳ͘ͳͬͨͰ͠ΐ͏͔

    •ਐԽͷૣ͍asyncio
    •3.7Ҏ߱ߴϨϕϧAPI͕ॆ࣮ ௚ײతͰΘ͔Γ΍͘͢
    •࣮͸3.11Ͱࠓ೔͝঺հͨ͠಺༰͕Ұ෦௠෗Խͯ͠͠·͏͔΋ʁ
    •PyConJP 2022 2022.10.14(Fri)-15(Sat) Ͱ͝঺հͰ͖Ε͹ʂͱࢥ͍·͢
    •΋ͬͱasyncio΍ଞͷʹ͍ͭͯ஌Γ͍ͨʂ
    •͓͢͢Ίίϯςϯπͨ͘͞Μ͋Γ·͢ʂʢँࣙγʔτͰʣ

    View Slide

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

    View Slide

  224. •࣮૷Ͱ஌Δ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

    View Slide

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

    View Slide