๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Python

์ฝ”๋ฃจํ‹ด

by ์„œ์•„๋ž‘๐Ÿ˜ 2024. 6. 23.

 

 

์ฝ”๋ฃจํ‹ด์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

ํŒŒ์ด์ฌ์˜ ์ฝ”๋ฃจํ‹ด(coroutine)์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์€ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์‹คํ–‰ ์ค‘์— ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  I/O ์ž‘์—…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์˜ ์ฝ”๋ฃจํ‹ด์€ async ๋ฐ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๊ณ  ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •์˜: ์ฝ”๋ฃจํ‹ด ํ•จ์ˆ˜๋Š” async def ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
  2. ํ˜ธ์ถœ: ์ฝ”๋ฃจํ‹ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ฝ”๋ฃจํ‹ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ: ์ฝ”๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝ”๋ฃจํ‹ด์€ ์ผ์‹œ ์ค‘์ง€๋˜๋ฉฐ, ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

 

์ฝ”๋ฃจํ‹ด์˜ ์˜ˆ์ œ

๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ์ฝ”๋ฃจํ‹ด์˜ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

import asyncio

async def my_coroutine():
    print("์ฝ”๋ฃจํ‹ด ์‹œ์ž‘")
    await asyncio.sleep(1)
    print("1์ดˆ ํ›„ ์ฝ”๋ฃจํ‹ด ์žฌ๊ฐœ")

async def main():
    print("๋ฉ”์ธ ํ•จ์ˆ˜ ์‹œ์ž‘")
    await my_coroutine()
    print("๋ฉ”์ธ ํ•จ์ˆ˜ ์ข…๋ฃŒ")

# ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰
asyncio.run(main())

์œ„ ์ฝ”๋“œ์—์„œ my_coroutine์€ async๋กœ ์ •์˜๋œ ์ฝ”๋ฃจํ‹ด ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. await asyncio.sleep(1)์€ 1์ดˆ ๋™์•ˆ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. main ํ•จ์ˆ˜์—์„œ my_coroutine์„ ํ˜ธ์ถœํ•˜๊ณ , asyncio.run(main())์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋น„๋™๊ธฐ I/O ์ž‘์—… ์ฒ˜๋ฆฌ

๋น„๋™๊ธฐ I/O ์ž‘์—…์„ ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import asyncio

async def fetch_data():
    print("๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘")
    await asyncio.sleep(2)  # ์‹ค์ œ๋กœ๋Š” I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ
    print("๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ")
    return {"data": "์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ"}

async def process_data():
    print("๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ์ž‘")
    data = await fetch_data()
    print(f"์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ: {data}")
    print("๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์™„๋ฃŒ")

async def main():
    await process_data()

asyncio.run(main())

์ด ์˜ˆ์ œ์—์„œ๋Š” fetch_data ์ฝ”๋ฃจํ‹ด์ด 2์ดˆ ๋™์•ˆ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. process_data ์ฝ”๋ฃจํ‹ด์€ fetch_data๋ฅผ awaitํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

์ฝ”๋ฃจํ‹ด์˜ ์žฅ์ 

  • ํšจ์œจ์ ์ธ I/O ์ฒ˜๋ฆฌ: ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ฉด I/O ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด, ์ž์›์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ: ์—ฌ๋Ÿฌ ์ฝ”๋ฃจํ‹ด์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์žก์„ฑ ๊ฐ์†Œ: ๊ธฐ์กด์˜ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋™์‹œ์„ฑ ๋ชจ๋ธ๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ์˜ ์ฝ”๋ฃจํ‹ด์„ ํ™œ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํŒŒ์ผ I/O, ํƒ€์ด๋จธ ๋“ฑ์˜ ์ž‘์—…์—์„œ ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ•  ๋ฌธ์„œ

์ฝ”๋ฃจํ‹ด(Coroutine)์— ๋Œ€ํ•˜์—ฌ

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด(coroutine) ๊ฐœ๋… ์ตํžˆ๊ธฐ · ์พŒ๋ฝ์ฝ”๋”ฉ

python ๋™์‹œ์„ฑ ๊ด€๋ฆฌ (3) - ์ฝ”๋ฃจํ‹ด(Coroutine)์ด๋ž€?

ํŒŒ์ด์ฌ ๋น„๋™๊ธฐ(async)ํ•จ์ˆ˜์™€ ์ฝ”๋ฃจํ‹ด(coroutine) ํ๋ฆ„ ์ดํ•ดํ•˜๊ธฐ

๋Œ“๊ธ€