์ฝ๋ฃจํด
์ฝ๋ฃจํด์ ๊ธฐ๋ณธ ๊ฐ๋
ํ์ด์ฌ์ ์ฝ๋ฃจํด(coroutine)์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝ๋ฃจํด์ ํจ์์ ์ ์ฌํ์ง๋ง, ์คํ ์ค์ ์ผ์ ์ค์งํ๊ณ ๋์ค์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋์์ฑ์ ๊ด๋ฆฌํ๊ณ I/O ์์ ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ์ด์ฌ์ ์ฝ๋ฃจํด์ async ๋ฐ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๊ณ ์ ์ดํฉ๋๋ค.
- ์ ์: ์ฝ๋ฃจํด ํจ์๋ async def ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค.
- ํธ์ถ: ์ฝ๋ฃจํด ํจ์๋ฅผ ํธ์ถํ๋ฉด ์คํ๋์ง ์๊ณ ์ฝ๋ฃจํด ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ผ์ ์ค์ง์ ์ฌ๊ฐ: ์ฝ๋ฃจํด ๋ด๋ถ์์ 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) ํ๋ฆ ์ดํดํ๊ธฐ