Upgrade to PRO for Only $50/Yearโ€”Limited-Time Offer! ๐Ÿ”ฅ

[PyCon KR 2023] Improving debuggability of comp...

[PyCon KR 2023] Improving debuggability of complex asyncioย applications

Avatar for Joongi Kim

Joongi Kim

August 12, 2023
Tweet

More Decks by Joongi Kim

Other Decks in Programming

Transcript

  1. v Improving debuggability of complex asyncio applications ๊น€์ค€๊ธฐ | ๋ณต์žกํ•œ

    asyncio ์•ฑ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น…ํ•˜๊ธฐ
  2. ๋ฐœํ‘œ์ž ์†Œ๊ฐœ โ€ข PyCon KR/JP/APAC/US ๋ฐœํ‘œ 9๋…„ ์—ฐ์†... โ€ข ๋ž˜๋ธ”์—…

    ์ฃผ์‹ํšŒ์‚ฌ CTO Co founder โ€ข ์ „์‚ฐํ•™ ๋ฐ•์‚ฌ ์ฃผ์ œ : ์ด๊ธฐ์ข… ๊ฐ€์†๊ธฐ ๊ธฐ๋ฐ˜ ๊ณ ์† ํŒจํ‚ท ์ฒ˜๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ โ€ข asyncio ์ƒํƒœ๊ณ„ ๊ธฐ์—ฌ โ€ข ์ทจ๋ฏธ ํ”ผ์•„๋‹ˆ์ŠคํŠธ
  3. ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ โ€ข ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ / CPU ์žก์•„๋จน๊ธฐ

    ์ค‘์š”ํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์˜ˆ๊ธฐ์น˜ ๋ชปํ•˜๊ฒŒ ์ข…๋ฃŒ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ค‘์š”ํ•œ ์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ ์‚ฌ๋ผ์ง ํŠนํžˆ ๋‚ด๊ฐ€ ์ง์ ‘ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด?? โ€ข asyncio ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”๊ฐ€?
  4. ์–ด๋ ค์šด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋“ค ๊ตฌ์กฐ์  ๋™์‹œ์„ฑ์œผ๋กœ ์˜ˆ๋ฐฉํ•˜๊ธฐ 1 ์‚ฌํ›„

    ๋ถ„์„ํ•˜๊ธฐ asyncio.TaskGroup aio-libs/{aiomonitor, aioconsole} asyncio.all_tasks() ์‹คํ–‰ ์ค‘์— ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ aiomonitor v2 ์ž‘์—… ์ข…๋ฃŒ ์ฒด์ธ ๋ถ„์„ aiomonitor v2 ์ž‘์—… ์ƒ์„ฑ ์ฒด์ธ ๋ถ„์„ asyncio ๋Œ€์•ˆ ์ ‘๊ทผ ๋ฐฉ๋ฒ• asyncio.Supervisor asyncio.as_completed_safe() trio.open_nursery() [1] https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/ aiotools.{TaskContext,TaskScope} aiotools.as_completed_safe() ? ? Traceback & logging N/A
  5. Traceback in asyncio โ€ข Python traceback์ด ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด ์˜ˆ์™ธ์˜ ํƒ€์ž…

    ๋ฐ ์˜ˆ์™ธ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ „๋‹ฌ๋œ ์ธ์ž ์Šคํƒ์˜ ์–ด๋А ์ง€์ ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด โ€ข ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ• ๊นŒ? ๋งŒ์•ฝ ์™ธ๋ถ€ ์ฝ”๋“œ๊ฐ€ cancellation์„ ์”น์–ด๋จน๋Š”๋‹ค๋ฉด? Task๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ garbage collection์ด ์ง€์—ฐ๋œ๋‹ค๋ฉด? File "~/workspace/aiomonitor-ng/examples/simple_aiohttp_srv.py", line 11, in inner2 await asyncio.sleep(100) File "~/.pyenv/versions/3.11.3/lib/python3.11/asyncio/tasks.py", line 639, in sleep return await future ^^^^^^^^^^^^ asyncio.exceptions.CancelledError
  6. Traceback in asyncio โ€ข ์šฐ๋ฆฌ๊ฐ€ ๋” ์•Œ์•„์•ผ ํ•˜๋Š” ์ •๋ณด ๋ˆ„๊ฐ€

    ์ด task๋ฅผ ์ทจ์†Œํ–ˆ๋Š”์ง€? ์˜ˆ ๋ช…์‹œ์  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ๋„ ์•„๋‹Œ๋ฐ task๊ฐ€ ์‚ฌ๋ผ์ ธ๋ฒ„๋ฆฐ ๊ฒฝ์šฐ ๋ˆ„๊ฐ€ ์ด task๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€? ์˜ˆ ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ์ˆ˜์˜ ๋™์ผ task๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ๋•Œ File "~/workspace/aiomonitor-ng/examples/simple_aiohttp_srv.py", line 11, in inner2 await asyncio.sleep(100) File "~/.pyenv/versions/3.11.3/lib/python3.11/asyncio/tasks.py", line 639, in sleep return await future ^^^^^^^^^^^^ asyncio.exceptions.CancelledError https://www.yes24.com/Product/Goods/6073365
  7. asyncio task๋“ค์˜ ์„ธ๊ณ„ ... asyncio ์•ฑ์€ ์„œ๋กœ ๋…๋ฆฝ๋œ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ 

    ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” task tree๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค. My Code 3rd Party Code My Code 3rd Party Code My Code My Code task stack Error! Swallows cancellation? raise cancel() await ... My Code 3rd Party Code create_task() await await callback task stack
  8. Quick start import aiomonitor async def main(): loop = asyncio.get_running_loop()

    run_forever = loop.create_future() with aiomonitor.start_monitor(loop): await run_forever try: asyncio.run(main()) except KeyboardInterrupt: pass $ pip install aiomonitor-ng $ edit test.py $ python test.py & $ telnet localhost 50101
  9. Quick start monitor >>> help Usage: help [OPTIONS] COMMAND [ARGS]...

    To see the usage of each command, run them with "--help" option. Commands: cancel Cancel an indicated task console Switch to async Python REPL exit (q,quit) Leave the monitor client session help (?,h) Show the list of commands ps (p) Show task table ps-terminated (pst,pt) List recently terminated/cancelled tasks signal Send a Unix signal stacktrace (st,stack) Print a stack trace from the event loop thread where (w) Show stack frames and the task creation chain of a task where-terminated (wt) Show stack frames and the termination/cancellation chain of a task
  10. aiomonitor v2 ์ถ”๊ฐ€ ์‚ฌํ•ญ โ€ข Task ์ƒ์„ฑ creation ์ฒด์ธ ์ถ”์ ๊ธฐ

    โ€ข Task ์ข…๋ฃŒ termination ์ถ”์ ๊ธฐ โ€ข Task ์ทจ์†Œ cancellation ์ฒด์ธ ์ถ”์ ๊ธฐ โ€ข prompt_toolkit Click ํ†ตํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ CLI ๊ณ ๋„ํ™” ๋ช…๋ น์–ด ๋ฐ ์ธ์ž ์ž๋™์™„์„ฑ ์ง€์› ํ„ฐ๋ฏธ๋„ ์œ ํ˜• ์ธ์‹ ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กฌํ”„ํŠธ ์ง€์›
  11. Task ์ƒ์„ฑ ์ฒด์ธ ์ถ”์ ๊ธฐ โ€ข Q: ์ด task์™€ ๊ทธ ๋ถ€๋ชจ

    task๋“ค์€ ๋ˆ„๊ฐ€ ๋งŒ๋“ค์—ˆ๋‚˜? โ€ข ๊ตฌํ˜„ class TracedTrask(asyncio.Task) asyncio.set_task_factory() ๋•๋ถ„์— ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ด์ง! Task๋“ค์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ ๋ณด๊ด€ where ๋ช…๋ น ์‹คํ–‰ ์‹œ ์•ฝํ•œ ์ฐธ์กฐ์˜ ์ฒด์ธ์„ ์ˆœํšŒํ•˜๋ฉฐ ์Šคํƒ ์ •๋ณด ์ถœ๋ ฅ โ€ข ๊ฐ€์ • ๋ถ€๋ชจ task๋Š” ๊ทธ ์ž์‹ task๋“ค์ด ์‚ด์•„์žˆ๋‹ค๋ฉด ํ•ญ์ƒ ์‚ด์•„์žˆ์Œ ์ˆ˜๋ช…์ฃผ๊ธฐ ํฌํ•จ ๊ด€๊ณ„ ๊ตฌ์กฐ์  ๋™์‹œ์„ฑ๊ณผ asyncio.TaskGroup์€ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์œ ๋„ํ•จ ์•ฝํ•œ ์ฐธ์กฐ๋งŒ ๋ณด๊ด€ํ•ด๋„ ๋ถ€๋ชจ๋ฅผ ํ•ญ์ƒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€์— ๋„์›€
  12. Task ์ƒ์„ฑ ์ฒด์ธ ์ถ”์ ๊ธฐ Task C Task B Task A

    await ...() ...() create_task(...) await ...() create_task(...) ...() await ...() await ...() create_task(...) Task D await ...() await ...() weak keys ...() Task A Task B Task C Task D Task A Task B Task B stack A stack B stack C stack D weak values _created_traceback_chain: WeakKeyDictionary[Task, weakref.ReferenceType[Task]) _created_tracebacks: WeakKeyDictionary[Task, list[traceback.FrameSummary])
  13. Task ์ข…๋ฃŒ ์ถ”์ ๊ธฐ โ€ข Q. ์•„์ฃผ ์˜ค๋ž˜ ์ „์ด๋ผ๋„ ์–ด๋–ค task๊ฐ€

    ์™œ ์ฃฝ์—ˆ์„๊นŒ? โ€ข ๊ตฌํ˜„ _trace_termination() ํ•จ์ˆ˜๋ฅผ task ์™„๋ฃŒ ์ฝœ๋ฐฑ์œผ๋กœ ๋“ฑ๋ก get_trace_id(): gc ํ›„์—๋Š” ์›๋ž˜ task object์˜ id()๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ID ์ƒ์„ฑ ์›๋ž˜ task object์˜ id()์™€ task ์ด๋ฆ„ ๊ธฐ๋ณธ๊ฐ’ : Task-XXX, ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด asyncio๊ฐ€ ๋‹จ์กฐ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ์ž๋™ ํ• ๋‹น ์„ ์กฐํ•ฉํ•˜์—ฌ ํ•ด์‹ฑ ์ตœ๋Œ€ ๋ณด๊ด€ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ @preserve_termination_logs ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํŠน์ • coroutine ํ•จ์ˆ˜์— ๋ถ™์ด๋ฉด ์ตœ๋Œ€ ๋ณด๊ด€ ๊ฐœ์ˆ˜์™€ ์ƒ๊ด€ ์—†์ด ์˜์›ํžˆ ์ข…๋ฃŒ ๋กœ๊ทธ ๋ณด์กด ์žฅ์‹œ๊ฐ„ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ์ค‘์š” task์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ข…๋ฃŒ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋ถ„์„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ ps-terminated, where-terminated ๋ช…๋ น์œผ๋กœ ์ข…๋ฃŒ ๋กœ๊ทธ ์กฐํšŒ
  14. Task ์ทจ์†Œ ์ฒด์ธ ์ถ”์ ๊ธฐ โ€ข Q: ์ด task๋ฅผ ์ทจ์†Œํ•œ task๋Š”

    ๋ˆ„๊ตฌ๊ณ , ๊ทธ task๋ฅผ ์ทจ์†Œํ•œ ๋˜๋‹ค๋ฅธ task๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€? โ€ข ๊ตฌํ˜„ Task.cancel() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ cancel() ์•ˆ์—์„œ ์กฐํšŒํ•˜๋Š” current_task() ์ทจ์†Œ๋ฅผ ์š”์ฒญํ•œ task cancel() ์•ˆ์—์„œ์˜ self ์ทจ์†Œ๋œ task ์ด ์‹œ์ ์—์„œ ์ทจ์†Œ๋ฅผ ์š”์ฒญํ•œ task์˜ ์Šคํƒ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ ์Šคํƒ ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ์ „์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  monitor UI thread๋กœ ์œ„์ž„ํ•˜์—ฌ tracker ๊ฐ์ฒด ์ƒ์„ฑ janus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐ/๋น„๋™๊ธฐ ์ฝ”๋“œ ์‚ฌ์ด์˜ ์ž๋ฃŒ ์ฃผ๊ณ ๋ฐ›๊ธฐ ๊ตฌํ˜„ ์ตœ๋Œ€ ๋ณด๊ด€ ๊ฐœ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด tracker ๊ฐ์ฒด ์‚ญ์ œ ps-terminated, where-terminated ๋ช…๋ น ๊ณต์œ 
  15. _termination_info_queue: janus.Queue[TerminatedTaskInfo] Task ์ข…๋ฃŒยท์ทจ์†Œ ์ฒด์ธ ์ถ”์ ๊ธฐ _cancellation_chain_queue: janus.Queue[CancellationChain] Task B

    Task X await ...() ...() task_b.cancel(...) await ...() Monitor UI thread App thread await ...() canceller cancellee cancel() extract_stack(task) filter_stack(task) cleanup_trackers() task done callback TracedTask.cancel()
  16. prompt toolkit Click ํ†ตํ•ฉ โ€ข aiomonitor v2 ๋™์‹œ์— ์—ฌ๋Ÿฌ ํ…”๋„ท

    ์„ธ์…˜ ์ง€์› aio libs/aiomonitor#140 ๋ช…๋ น์–ด ๋ฐ task ์ฐธ์กฐ ID์— ๋Œ€ํ•œ ์ž๋™์™„์„ฑ ์ง€์› / task ๋ชฉ๋ก ํ•„ํ„ฐ๋ง ์กฐ๊ฑด ์˜ต์…˜ ์ถ”๊ฐ€ โ€ข ๊ตฌํ˜„ contextvars๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ ํ…”๋„ท ์„ธ์…˜๋งˆ๋‹ค ๋‹ค์Œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”์  ๋ฐ ๊ณต์œ  monitor ์ธ์Šคํ„ด์Šค ํ˜„์žฌ ํ…”๋„ท ์—ฐ๊ฒฐ์— ๋ฐ”์ธ๋”ฉ๋œ stdout ์ถœ๋ ฅ ๊ฐ์ฒด asyncio.Event๋ฅผ ํ™œ์šฉํ•˜์—ฌ Click command ๊ฐ์ฒด์— ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€ ํ†ต์ง€ ์ง์ ‘ ClickCompleter ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ์ œ๊ณต
  17. A part of task creation chain trace showing that a

    3rd party library (grpcio) creates internal sub-tasks โ† my code โ† 3rd party code
  18. Case: Backend.AI๊ฐ€ ๋ฉˆ์ท„์–ด์š”! โ€ข ์ฆ์ƒ : ์•„๋ฌด๋Ÿฐ ์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ ์—†๋Š”๋ฐ

    ์•ฑ ์‹œ์ž‘ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘๋‹จ๋จ โ€ข ๋ถ„์„ : ํ•ญ์ƒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” process_lifecycle_events() task๊ฐ€ ๊ฐ‘์ž๊ธฐ ์‚ฌ๋ผ์ง... asyncio.TaskGroup๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์ž์‹ task์˜ ์˜ˆ์™ธ๋กœ ์ธํ•ด ๋ถ€๋ชจ task๊นŒ์ง€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜์–ด ๋ฒ„๋ฆผ TaskGroup์€ ์ž์‹ task ์ค‘ 1๊ฐœ๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ฐ”๋กœ ์ „์ฒด๋ฅผ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ทจ์†Œ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋ฉด์„œ ์ž์‹ task๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์šฉ๋„๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ Supervisor API์˜ ํ•„์š”์„ฑ์„ ๊นจ๋‹ซ๊ฒŒ ๋œ ๊ณ„๊ธฐ โ€ข aiomonitor์˜ task termination log ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐœ๊ฒฌ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐœ์„ , TaskGroup ์‚ฌ์šฉ ์ค‘์ง€
  19. Case: Backend.AI๊ฐ€ CPU๋ฅผ ๋‹ค ์žก์•„๋จน์–ด์š”! โ€ข ์ฆ์ƒ : ํŠน์ • ๊ณ ๊ฐ์‚ฌ์—์„œ๋งŒ

    ๋ฐœ์ƒํ•˜๋Š” ์†๋„ ์ €ํ•˜ ๋ฐ ๋ฉˆ์ถค ํ˜„์ƒ โ€ข ๋ถ„์„ : ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ ์˜ ํŒŒ์ผ์„ ํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ๋Š” ๋ฐ”๋žŒ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ์ž‘์—…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์‹คํ–‰ ์ฃผ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ๋ฌดํ•œํžˆ ์Œ“์ž„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฐ๊ณผ 6,000๊ฐœ ์ด์ƒ์˜ task๊ฐ€ ์Œ“์˜€๊ณ , ์ด๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ executor pool์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์–ด ์ผ์ข…์˜ thrashing ๋ฐœ์ƒ โ€ข aiomonitor์˜ ์‹ค์‹œ๊ฐ„ task ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฌธ์ œ ํŒŒ์•… ๋ฐ ํšŒํ”ผ ๋กœ์ง ์ž‘์„ฑ
  20. Case: ์™ธ๋ถ€ ์˜์กด์„ฑ์— ์ˆจ์–ด์žˆ๋Š” ํญํƒ„... โ€ข ์ฆ์ƒ : grpcio๋ฅผ ํŠน์ •

    ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ์ดํ›„ ๊ณ ๊ฐ์‚ฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ๊ฒฌ โ€ข ๋ถ„์„ : grpcio ๋‚ด๋ถ€ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋ช…์‹œ์ ์ธ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” secure ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ etcd์— ์ ‘๊ทผํ•˜๋ฉด ํŠน์ • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํด๋ฆฐ์—…์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Œ grpc/grpc#25449 ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ๊ฒƒ์ด ์•„๋‹Œ grpcio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ƒ์„ฑํ•œ task๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์Œ“์ž„ โ€ข aiomonitor์˜ task creation chain tracker๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ ํŒŒ์•… ๋ฐ grpcio ๋ฒ„๊ทธ ํ•ด๊ฒฐ ์ „๊นŒ์ง€ ๋ฒ„์ „ ๊ณ ์ •
  21. ๊ตํ›ˆ โ€ข Debuggability ๊ด€์ฐฐ์šฉ์ด์„ฑ observability ์žฌํ˜„๊ฐ€๋Šฅ์„ฑ reproducibility ๋Ÿฐํƒ€์ž„์— ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ ์‚ฌํ›„๋ถ„์„์„

    ์œ„ํ•œ ๋กœ๊น… โ€ข asyncio๋Š” ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ๊ณ ์œ ์˜ ํŠนํ™”๋œ ๋„๊ตฌ๋“ค์ด ํ•„์š”ํ•˜๋‹ค! ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ ์ƒํ™ฉ์— ์—ฌ๋Ÿฌ task๊ฐ€ ๊ด€์—ฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚˜์˜ ํ†ต์ œ ๋ฐ–์— ์žˆ๋Š” task๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ ์—ฌ๋Ÿฌ task์™€ ๊ทธ stack๋“ค์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ํ†ตํ•ฉ์  ์‹œ์  holistic view ์ด ํ•„์š”ํ•จ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ฝ”๋“œ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šด ์ด์œ ์™€๋„ ์ผ๋งฅ์ƒํ†ต โ€ข ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋„๊ตฌ ๊ฐœ์„ ์— ๊พธ์ค€ํ•œ ๊ด€์‹ฌ๊ณผ ํˆฌ์ž๊ฐ€ ํ•„์š”ํ•จ ๋‹น์žฅ ์ œํ’ˆ์˜ ๊ธฐ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š” ๋“ฑ์˜ ๋ˆˆ์— ๋ณด์ด๋Š” ์„ฑ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜์œ ์ผ๋“ค์ด ๋ฒŒ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ํฌ๊ฒŒ ์•„๋‚„ ์ˆ˜ ์žˆ์Œ
  22. PyCon US 2023 Sprint โ€ข aio libs ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ํŠนํ›ˆ ?!

    https://github.com/webknjaz โ€ข ์›๋ž˜ achimnol/aiomonitor ng๋กœ forkํ–ˆ์—ˆ๋Š”๋ฐ, ์•„์˜ˆ aio libs/aiomonitor ๋ฉ”์ธํ…Œ์ด๋„ˆ๋กœ ์Šน๊ฒฉ โ€ข ๊ฐ์ข… CI/CD ๋„๊ตฌ ๋ฐ ๊ธฐ๋ฒ• ์ „์ˆ˜ pre commit.yml ์„  ํŒจํ‚ค์ง• ํ›„ ํ…Œ์ŠคํŠธ GitHub Actions Environment ๋ฆด๋ฆฌ์ฆˆ ์ „ ์‚ฌ์ „ ํ—ˆ๊ฐ€ ๋ฐ ๋…๋ฆฝ๋œ secret ์ ‘๊ทผ ๊ถŒํ•œ with Sviatoslav Syndorenko Zac Hatfield Dodds
  23. ์•ž์œผ๋กœ ํ•  ์ผ โ€ข Scope๋กœ ๊ตฌ๋ถ„๋œ ์‹ค์‹œ๊ฐ„ task ๋ชฉ๋ก ๋ณด๊ธฐ

    ๊ตฌ์กฐํ™”๋œ asyncio ์•ฑ task group์˜ ๊ณ„์ธตํ™”๋œ ํŠธ๋ฆฌ ์žฅ๊ธฐ๊ฐ„ ์‹คํ–‰๋˜๋Š” task group supervisor ๋“ค์˜ ์‹œ๊ฐํ™” ๊ทธ๋Ÿฌํ•œ task group๋“ค ํ•˜์œ„์— ์†ํ•œ task๋“ค์„ ํ•„ํ„ฐ๋งํ•ด์„œ ๋ณด๊ธฐ โ€ข Top๊ณผ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™”๋ฉด ์˜ˆ ๊ฐ€์žฅ ์ตœ๊ทผ ํ˜น์€ ์ด์ „์— ์ปจํ…์ŠคํŠธ ์ „ํ™˜์ด ๋ฐœ์ƒํ•œ task ์ˆœ์œผ๋กœ ์ •๋ ฌ โ€ข ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด subinterpreter ๋„์ž…ํ•˜๊ธฐ Python 3.12 โ€ข ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ pagination ๊ฐœ์„  ํŠนํžˆ task ๊ฐœ์ˆ˜๊ฐ€ ์ˆ˜ ์ฒœ, ์ˆ˜ ๋งŒ ๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์ƒํ™ฉ์— ๋Œ€๋น„ โ€ข PyCon KR Sprint: ์›น ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™”๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ
  24. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! 2015๋…„ ์ฐฝ์—…ํ•˜์—ฌ Python ๋ฐ asyncio ๊ธฐ๋ฐ˜์˜ Backend.AI ํ”Œ๋žซํผ์œผ๋กœ ์ „

    ์„ธ๊ณ„ 70์—ฌ๊ณณ ์ด์ƒ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ณ ๊ฐ์˜ AI ๊ฐœ๋ฐœ๊ณผ ์„œ๋น„์Šค๋ฅผ ๋•๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค์™€ hard tech ์—ฌ์ •์— ํ•จ๊ป˜ ํ•˜์‹ค ๋ถ„๋“ค์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! https://backend.ai https://lablup.com https://github.com/lablup/backend.ai