๐ [Python] ์ฝ๋ฃจํด? async? await?
asyncio?
asyncio
๋, async/await
๊ตฌ๋ฌธ์ ์ฌ์ฉํด ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์!
async
+ I/O
์ ํฉ์ฑ์ด๋ก ๋ณผ ์ ์์.
asyncio
๋ ๊ณ ์ฑ๋ฅ ๋คํธ์ํฌ ๋ฐ ์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ถ์ฐ ์์
ํ ๋ฑ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํ์ด์ฌ ๋น๋๊ธฐ ํ๋ ์์ํฌ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
๋, ๋ค์๊ณผ ๊ฐ์ ์์ ๋ค์ ์ํ ๊ณ ์์ค API ์งํฉ์ ์ ๊ณตํ๊ณ ์๋ค!
- ํ์ด์ฌ
์ฝ๋ฃจํด
๋ค์ ๋์์ ์คํํ๊ณ , ์คํ์ ์์ ํ ์ ์ดํ ์ ์์ - ๋คํธ์ํฌ IO & IPC๋ฅผ ์ํํจ
- ์์ ํ๋ก์ธ์ค๋ฅผ ์ ์ดํจ
ํ
๋ฅผ ํตํด ์์ ์ ๋ถ์ฐํจ- ๋์์ฑ ์ฝ๋๋ฅผ
๋๊ธฐํ
ํจ
๊ณ ์์ค API๊ฐ ์์ผ๋ฉด ์ ์์ค API๋ ์๊ฒ ์ง?
์ ์์ค API๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ & ํ๋ ์์ํฌ ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ ์ ์๋๋ก ๋์์ค!
- ๋คํธ์ํน, ํ์ ํ๋ก์ธ์ค ์คํ, OS ์ ํธ ์ฒ๋ฆฌ ๋ฑ์ ์ํ ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ๋ ์ด๋ฒคํธ ๋ฃจํ ์์ฑ ๋ฐ ๊ด๋ฆฌ
ํธ๋์คํฌํธ
๋ฅผ ์ฌ์ฉํ ํจ์จ์ ์ธ ํ๋กํ ์ฝ ๊ตฌํ- ์ฝ๋ฐฑ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
async/await
๊ตฌ๋ฌธ์ ์ฌ์ฉ์ผ๋ก ์ฝ๋ ๊ฐ์ ์ฐ๊ฒฐ๋ค๋ฆฌ ๊ตฌ์ถ
๊ทธ๋ฌ๋ฉด ์ asyncio๋ฅผ ์ฐ๋๋ฐ?
์ ๋ด์ฉ๋ค์ ๊ทธ๋ ๋ค์น๊ณ , ์ asyncio
๋ฅผ ์จ์ผํ๋๊ฐ..!
์ค๋ ๋ฉ์ ์ฌ์ฉํ ๋์์ฑ ์ ์ด์ ํฐ ๋จ์ ์ ๋ฐ๋ก ๋๋ฆฌ๋ค๋ ๊ฒ..!
Global interpreter lock
๋๋ฌธ์ ์ค์ ๋ก ์ฌ๋ฌ ๋ฌผ๋ฆฌ ์ค๋ ๋์์ ์คํ๋๋ ๊ฒ์ด ์๋ ๋ฉ์ธ ์ค๋ ์ด๋์์ ๋ชจ๋ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํจ
๊ทธ ์์ค์ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ๊ณ ์๋ ๋ฌธ์ ์ ๋ค ๋ํ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ค๋ ๋จ์ ์ด ์กด์ฌํ๋ค..
์ค๋ ๋ฉ์ ํตํด ์ป๊ณ ์ ํ๋ ์ด์ ์ ํ์ผ์ Read & Write, HTTP ํต์ ๋๊ธฐ์ ๊ฐ์ Blocking IO ๋๊ธฐ ์๊ฐ
์!!
๊ทธ๋ฌ๋ฉด ๊ฐ๋ฐ์๋ Blocking IO๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋๋๋ฐ, ์ค๋ ๋ฉ์ ์ผ๋จ ๋๋ฌด ๋ณต์กํจ..ใ
๊ทธ๋์ asyncio
๊ฐ ์ด๋ฐ ์ด๋ ค์ด ์ ์ ๋์์ฃผ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด๋ค!
asyncio
๋ ์ฝ๊ณ , ๋ช
์์ ์ผ๋ก ํ๋ฆ์ ์ ์ ์์ผ๋ฉฐ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฌธ์ ์ ์ ๋ฌด์ํ ์ ์๋ค๊ณ ํจ!
์ฝ๋ฃจํด?
์ฝ๋ฃจํด
์ ๋ค์ด๋ณด๊ธฐ๋ ํ๋ค. (์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ฝํ๋ฆฐ ๊ด๋ จ ๊ฐ์ ํน์ ์๋ฃ๋ฅผ ๋ณด๋ฉด ํญ์ ๋ฐ๋ผ๋ค๋)
์ฝ๋ฃจํด์ด ๋ญ๊น? ์์๋ฅผ ๋ค์ด ํ์ธํด๋ณธ๋ค!
๊ธฐ์กด์๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด, ํจ์๋ฅผ ์คํํ๊ณ ๊ทธ ๋์์ด ๋๋๋ฉด ํ์ฌ์ ์ฝ๋๋ก ๋์์๋ค.
์๋ฅผ ๋ค์ด calc
ํจ์ ์์์ add
๋ฅผ ํธ์ถํ์ ๋, add
ํจ์๊ฐ ๋๋๋ฉด ๋ค์ calc
ํจ์๋ก ๋์์จ๋ค.
def add(a, b):
c = a + b # add ํจ์๊ฐ ๋๋๋ฉด ๋ณ์์ ๊ณ์ฐ์์ ์ฌ๋ผ์ง
print(c)
print('add ํจ์')
def calc():
add(1, 2) # add ํจ์๊ฐ ๋๋๋ฉด ๋ค์ calc ํจ์๋ก ๋์์ด
print('calc ํจ์')
calc()
์ฌ์ง์ด, add
ํจ์๊ฐ ๋๋๋ฉด ์ด ํจ์์ ๋ค์ด์๋ ๋ณ์์ ๊ณ์ฐ์์ ๋ชจ๋ ์ฌ๋ผ์ง๋ค..!
์ฌ๊ธฐ์ calc
์ add
์ ๊ด๊ณ๋ฅผ ์๊ฐํด๋ณด๋ฉด, calc
๊ฐ ๋ฉ์ธ ๋ฃจํด, add
๋ calc
์ ์๋ธ ๋ฃจํด์ด๋ค!
๋ฉ์ธ ๋ฃจํด๊ณผ ์๋ธ ๋ฃจํด์ ๋์ ๊ณผ์
์ฝ๋ฃจํด์ ๋์ ๋ฐฉ์
์ฝ๋ฃจํด
์ Cooperative Routine
๋ฅผ ์๋ฏธํ๋๋ฐ, ์๋ก ํ๋ ฅํ๋ ๋ฃจํด์ด๋ผ๋ ๋ป์!
๊ธฐ์กด ๋ฉ์ธ-์๋ธ ๋ฃจํด
๊ณผ๋ ๋ค๋ฅด๊ฒ, ์๋ก ์ข
์๋ ๊ด๊ณ๊ฐ ์๋ ์๋ก ๋๋ฑํ ๊ด๊ณ์์ ๋์ํ๋ค.
์ด์ฒ๋ผ ์ฝ๋ฃจํด์ ํจ์๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ์์ ๋ฉ์ธ ๋ฃจํด์ ์ฝ๋๋ฅผ ์คํํ ๋ค์ ๋ค์ ๋์์์ ์ฝ๋ฃจํด์ ์ฝ๋๋ฅผ ์คํํ๋ค.
๋ฐ๋ผ์ ์ฝ๋ฃจํด์ด ์ข ๋ฃ๋์ง ์์์ผ๋ฏ๋ก ์ฝ๋ฃจํด์ ๋ด์ฉ๋ ๊ณ์ ์ ์ง๋๋ค.
์ผ๋ฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ฝ๋๋ฅผ ํ ๋ฒ๋ง ์คํํ ์ ์์ง๋ง, ์ฝ๋ฃจํด์ ์ฝ๋๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค!
- ์ด์ฒ๋ผ ํจ์์ ์ฝ๋๋ฅผ ์คํํ๋ ์ง์ ์
์ง์ ์ (entry point)
์ด๋ผ๊ณ ํ๋๋ฐ, ์ฝ๋ฃจํด์ ์ง์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ํจ์์
์ฝ๋ฃจํด ๋์ ์์
์ฝ๋ฃจํด์ ์ ๋๋ ์ดํฐ์ ํน๋ณํ ํํ์!
์ ๋๋ ์ดํฐ๋ yield
๋ก ๊ฐ์ ๋ฐ์์ํค์ง๋ง, ์ฝ๋ฃจํด์ yield
๋ก ๊ฐ์ ๋ฐ์์ด..!
def number_coroutine():
while True: # ์ฝ๋ฃจํด์ ๊ณ์ ์ ์งํ๊ธฐ ์ํด ๋ฌดํ ๋ฃจํ ์ฌ์ฉ
x = (yield) # ์ฝ๋ฃจํด ๋ฐ๊นฅ์์ ๊ฐ์ ๋ฐ์์ด, yield๋ฅผ ๊ดํธ๋ก ๋ฌถ์ด์ผ ํจ
print(x)
co = number_coroutine()
next(co) # ์ฝ๋ฃจํด ์์ yield๊น์ง ์ฝ๋ ์คํ(์ต์ด ์คํ)
co.send(1) # ์ฝ๋ฃจํด์ ์ซ์ 1์ ๋ณด๋
co.send(2) # ์ฝ๋ฃจํด์ ์ซ์ 2์ ๋ณด๋
co.send(3) # ์ฝ๋ฃจํด์ ์ซ์ 3์ ๋ณด๋
- ์ฝ๋ฃจํด๊ฐ์ฒด.send(๊ฐ)
- ๋ณ์ = (yeild)
์ด์ฒ๋ผ ์ฝ๋ฃจํด์ ๊ฐ์ ๋ณด๋ด๋ฉด์ ์ฝ๋๋ฅผ ์คํํ ๋๋ send()
๋ฅผ, send()๊ฐ ๋ณด๋ธ ๊ฐ์ ๋ฐ์์ค๋ ค๋ฉด (yield)
ํ์์ ์ฌ์ฉํ๋ค!
์ฝ๋ฃจํด์ ๋ํด์๋ ๋ค๋ฅธ ํ ์คํธ ์ฝ๋์ ํจ๊ป ๋ค์ ๊น๋ํ๊ฒ ์ ๋ฆฌํด๋ณด์!
async/await?
async/await
๊ตฌ๋ฌธ์ ์ต์ ํ์ด์ฌ ๋ฒ์ ์์๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ ์ํ๋ ๋งค์ฐ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด๋ค!
burgers = await get_burgers(2)
์ฌ๊ธฐ์ await
์ด ํต์ฌ์ธ๋ฐ, ํ์ด์ฌ์๊ฒ burgers
๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ get_burgers(2)
์ ์์
์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ผ๊ณ ๋งํ๋ ์๋ฏธ์!
๊ทธ๋ฌ๋ฉด? ํ์ด์ฌ์ ๊ทธ ๋์ ๋ค๋ฅธ ์์ ์ ์ํํด๋ ๋๋ค๋ ๊ฒ์ด๋ค!
์ฌ๊ธฐ์ await
๊ฐ ๋์ํ๊ธฐ ์ํด์๋ ์ด ๊ตฌ๋ฌธ์ด ๋น๋๊ธฐ๋ฅผ ์ง์ํ๋ ํจ์
๋ด๋ถ์ ์์ด์ผํ๋๋ฐ..
์ด ๋น๋๊ธฐ ํจ์๋ฅผ async
์์ฝ์ ์ฌ์ฉํด ์ ์ํ ์ ์๋ค!
async def get_burgers(number: int):
burgers = await get_burgers(2)
return burgers
์ฆ, await
๋ async def
์์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์์ฝ์ด์ธ ๊ฒ์ด๋ค!
ํ์ง๋ง ๋์์ async def
๋ก ์ ์๋ ํจ์๋ค์ ๋๊ธฐ ๋์ด์ผ๋ง ํ๊ธฐ ๋๋ฌธ์, async def
**๋ฅผ ์ฌ์ฉํ ํจ์๋ค์ ์ญ์ async def
๋ฅผ ์ฌ์ฉํ ํจ์ ๋ด๋ถ์์๋ง ํธ์ถ๋ ์ ์๋ค!
์ต์ ํ์ด์ฌ ๋ฒ์ ์ย
async
ย ๋ฐยawait
ย ๋ฌธ๋ฒ๊ณผ ํจ๊ปย์ฝ๋ฃจํด
์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํ๋ย๋น๋๊ธฐ ์ฝ๋
๋ฅผ ์ง์ํ๋ค!
์ฐธ๊ณ ์๋ฃ
ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ: 41.1 ์ฝ๋ฃจํด์ ๊ฐ ๋ณด๋ด๊ธฐ
Python3.8 asyncio, async/await ๊ธฐ์ด - ์ฝ๋ฃจํด๊ณผ ํ์คํฌ
๋๊ธ๋จ๊ธฐ๊ธฐ