3 ๋ถ„ ์†Œ์š”

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ย ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ย ์ฝ”๋ฃจํ‹ด ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”ย ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋ฅผ ์ง€์›ํ•œ๋‹ค!

์ฐธ๊ณ  ์ž๋ฃŒ

์ฝ”๋ฃจํ‹ด๊ณผ ํƒœ์Šคํฌ

asyncio โ€” Asynchronous I/O

ํŒŒ์ด์ฌ ์ฝ”๋”ฉ ๋„์žฅ: 41.1 ์ฝ”๋ฃจํ‹ด์— ๊ฐ’ ๋ณด๋‚ด๊ธฐ

Python3.8 asyncio, async/await ๊ธฐ์ดˆ - ์ฝ”๋ฃจํ‹ด๊ณผ ํƒœ์Šคํฌ

๋™์‹œ์„ฑ๊ณผ async / await - FastAPI

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ