Slide 1

Slide 1 text

©OVERDUEBOOK Python 3.6 Release Party ~asynchronous related~ 2017-01-31 Tue. Tetsuya Morimoto

Slide 2

Slide 2 text

INTRODUCTION ৿ຊ఩໵ (@t2y) ϙʔλϧαΠτͷձࣾ ੲ͸αʔόʔαΠυΤϯδχΞ ࠓ͸ΠϯϑϥΤϯδχΞݟश͍ new! ͓࢓ࣄͰ͸ओʹ Go ॻ͍͍ͯΔ͚ͲɺPython ΋࢖͍·͢ ࠷ۙ΍ͬͨ͜ͱ [຋༁]αΠτ৴པੑΤϯδχΞϦϯά (SRE) ͱ͸Կ͔ʁ

Slide 3

Slide 3 text

AGENDA ඇಉظʗฒߦॲཧͷഎܠ Python 3 ͷඇಉظॲཧͷมભ asyncio ϞδϡʔϧΛ࢖ͬͯΈΑ͏ Python 3.6 ͷඇಉظॲཧͷ৽ػೳ (PEP-525/530) asyncio ͷ՝୊ʁ ·ͱΊ

Slide 4

Slide 4 text

ATTENTION ͜͜Ͱ঺հ͢Δࢿྉ΋ίʔυ΋ެ։͠·͢ ࢲ͕ asyncio ΍ؔ࿈ٕज़ʹૄ͍ͨΊɺҰੜݒ໋ௐ΂ͨ͜ͱΛ ·ͱΊͨͭ΋ΓͰ͕͢ɺؒҧ͍ͬͯͨΒ͝ΊΜͳ͍͞

Slide 5

Slide 5 text

ඇಉظʗฒߦॲཧͷഎܠ

Slide 6

Slide 6 text

ASYNCHRONOUS APPROACH ϚϧνεϨου vs. Πϕϯτۦಈ ෼͔Γ΍͍͢ൺֱ Apache vs. Nginx Java (JVM) vs. Node.js ͲͪΒ͕ྑ͍ͱ͍͏Θ͚Ͱ͸ͳ͘Ξϓϩʔνͷҧ͍ ΞϓϦέʔγϣϯͷಛੑʹΑͬͯ޲͖ෆ޲͖͸͋Δʁ ࠓ೔ͷ࿩୊͸ͬͪ͜

Slide 7

Slide 7 text

CONCURRENT & PARALLEL ฒߦ (concurrent) ͱฒྻ (parallel) ݫີͳఆٛ͸ͳ͍ Rob Pike ࢯͷߨԋʹΑΔͱɺ͜ΜͳΠϝʔδˣ ࠓ೔ͷ࿩୊͸ͬͪ͜

Slide 8

Slide 8 text

EXECUTABLE PROGRAM ࣮ߦϓϩάϥϜͷॲཧͷ෼ׂ୯Ґ ϓϩηε (Process) OS ͕؅ཧɺಠࣗͷϝϞϦۭؒ (ωΠςΟϒ)εϨου (Thread) OS ͕؅ཧɺಉҰϓϩηε಺ͰϝϞϦۭؒΛڞ༗ ίϧʔνϯ (Coroutine) ≒ ϑΝΠόʔʗδΣωϨʔλʔ (ػೳతʹ͸ಉ͡) ॲཧΛ్தͰҰ࣌தஅͨ͠Γɺ్த͔Β෮ݩͨ͠Γ͠ͳ͕Β࣮ߦͰ͖Δ ݴޠ (ΞϓϦ) ͕؅ཧ ϓϩηε1 εϨου1 εϨου2 ϓϩηε2

Slide 9

Slide 9 text

SEMANTICS IN PYTHON 3 δΣωϨʔλʔ yield, yield from Λ࢖ͬͯఆٛͨؔ͠਺ ίϧʔνϯ ωΠςΟϒίϧʔνϯ (native coroutine) async def ߏจͰ࣮૷͞ΕΔ δΣωϨʔλʔϕʔεͷίϧʔνϯ (generator-based coroutine) δΣωϨʔλʔߏจͰ࣮૷͞ΕΔ ίϧʔνϯؔ਺ ίϧʔνϯΦϒδΣΫτΛฦؔ͢਺ɺasync ߏจΛ࢖͏

Slide 10

Slide 10 text

PYTHON 3 ͷඇಉظॲཧͷมભ

Slide 11

Slide 11 text

HISTORY (1) 3.3 yield from ߏจ δΣωϨʔλʔ಺෦ͰαϒδΣωϨʔλʔ΁ͷҠৡ PEP 380 -- Syntax for Delegating to a Subgenerator 3.4 asyncio ϞδϡʔϧΛඪ४ϥΠϒϥϦ΁ (࢑ఆ) ඇಉظʗฒߦॲཧΛ࣮૷͢ΔͨΊͷΠϯϑϥ PEP 3156 -- Asynchronous IO Support Rebooted: the "asyncio" Module

Slide 12

Slide 12 text

HISTORY (2) 3.5 async ߏจͱ await ࣜ ωΠςΟϒίϧʔνϯΛಋೖ PEP 492 -- Coroutines with async and await syntax 3.6 asyncio Ϟδϡʔϧͷ API ͕࢑ఆ → ҆ఆ΁ ඇಉظδΣωϨʔλʔͱඇಉظ಺แදهΛಋೖ PEP 525 -- Asynchronous Generators PEP 530 -- Asynchronous Comprehensions new! ࠓ೔ͷ࿩୊͸͜͜

Slide 13

Slide 13 text

ASYNCIO ϞδϡʔϧΛ࢖͏

Slide 14

Slide 14 text

USE CASE ίϧʔνϯͬͯͲ͏͍͏ͱ͖ʹ࢖͏ͷʁ ڠௐతϚϧνλεΫɺྫ֎ɺΠϕϯτϧʔϓɺΠςϨʔ λʔɺແݶϦετɺύΠϓͱ͍ͬͨॲཧΛ࣮૷͢Δͱ͖ ར༻ྫ ঢ়ଶϚγϯ ΞΫλʔϞσϧ CSP (Communicating Sequential Processes)

Slide 15

Slide 15 text

SAMPLE CODE Producer-Consumerύλʔϯ Λ࣮૷ͯ͠ΈΔ ੜ࢈ऀ (Producer): 3ਓɺ৯΂΋ͷΛςʔϒϧʹஔ͘ ফඅऀ (Consumer): 3ਓɺςʔϒϧʹ͋Δ΋ͷΛ৯΂Δ ςʔϒϧ: ৯΂΋ͷΛஔ͘৔ॴɺ1͔ͭ͠ஔ͚ͳ͍ e.g.) producer_consumer_pattern_generator_based_coroutine.py producer_consumer_pattern_native_coroutine.py

Slide 16

Slide 16 text

PYTHON 3.6 ͷඇಉظॲཧͷ৽ػೳ (PEP-525/530)

Slide 17

Slide 17 text

ඇಉظδΣωϨʔλʔ (PEP-525) ඇಉظδΣωϨʔλʔΛ yield Λ࢖ͬͯఆٛͰ͖Δ ͜Ε·ͰͷδΣωϨʔλʔΛఆٛ͢Δͷͱಉ͡ײ֮ ͓खܰɺ׌ͭ2ഒ଎͍ e.g.) async_iter_ticker.py async_for_example_pep492.py async_for_example_pep525.py

Slide 18

Slide 18 text

ඇಉظ಺แදه (PEP 530) ඇಉظ಺แදهͷهड़ set: {await afun(i) async for i in agen()} list: [await afun(i) async for i in agen()] dict: {i: await afun(i ** 2) async for i in agen()} generator: (await afun(i ** 2) async for i in agen()) ͜ΕΒ͸ async def Ͱఆٛ͞Εͨؔ਺಺ͰͷΈར༻Ͱ͖Δ ඇಉظδΣωϨʔλʔࣜ͸ 3.7 ͰͲ͜Ͱ΋࢖͑ΔΑ͏ʹͳΔ e.g.) async_comprehension_example.py

Slide 19

Slide 19 text

ASYNCIO ͷ՝୊ʁ

Slide 20

Slide 20 text

ARMIN RONACHER’S BLOG I don’t understand Python’s Asyncio ͱ͍͏ϒϩάهࣄ twisted ͔Β֓೦ΛऔΓೖΕ͍ͯΔʁ δΣωϨʔλʔͷઃܭϛε e.g.) surprising_generator.py ෳ਺ͷΠϕϯτϧʔϓΛෳ਺εϨουͰѻ͏ͱ͖ʹ໌ࣔతͱ͸ݴ͑ͳ͍Ͷ ΠϕϯτϧʔϓͰ subprocess Λ࣮ߦͯͦ͠ͷγάφϧΛัଊͯ͠ dispatch ͢Δͱ͔ ϩʔΧϧσʔλΛѻ͏ context ͷ֓೦͕ͳ͍ΑͶ ͦ΋ͦ΋ asyncio ʹ context ͷ֓೦͕ͳ͍ asyncio ͷ࠷ѱͳͱ͜Ζ͸େͯ͠଎͘ͳ͍ David Beazley ࢯͷ curio ͸ asyncio ΑΓ75-150% ΄Ͳ଎͍ https://github.com/dabeaz/curio

Slide 21

Slide 21 text

JINJA 2.9 RELEASE Jinja 2.9 Released Python 3 Feature Support ͜ͷ࣮૷Λ͍ͯͯ͠ϒϩάΛॻ͍ͨΜͩͱࢥ͏ jinja2 Ͱ async/await Λϑϧαϙʔτ ςϯϓϨʔτΤϯδϯʹ coroutine function Λ౉ͤΔ

Slide 22

Slide 22 text

·ͱΊ

Slide 23

Slide 23 text

SUMMARY ඇಉظʗฒߦॲཧͷ͜ͱ ຊ࣭తʹ೉͍͠ॲཧͷ1ͭ ݴޠॲཧܥ͕ϓϩάϥϚʔΛαϙʔτ: async/await Python 3 ʹ͔͠ͳ͍৽ػೳ 2→3 ҠߦΛଅ͢ຊ໋ʁ (≠ ϓϩύΨϯμ) 3.6 Ͱػೳ͕Ұஈམʁ asyncio Ϟδϡʔϧͷ API ͕҆ఆ൛΁ ඇಉظδΣωϨʔλʔ

Slide 24

Slide 24 text

REFERENCE ൃදͰ঺հͨ͠αϯϓϧίʔυ https://github.com/t2y/python-study/tree/master/ Python36ReleaseParty/async ϚϧνίΞ࣌୅ͷ࠷৽ฒྻฒߦٕज़ Overview of Modern Concurrency and Parallelism Concepts 18.5. asyncio — Asynchronous I/O, event loop, coroutines and tasks pymotw3: asyncio — Asynchronous I/O, event loop, and concurrency tools