Task ํด๋ž˜์Šค

Python SELF KO
๋ ˆ๋ฒจ 26 , ๋ ˆ์Šจ 0
์‚ฌ์šฉ ๊ฐ€๋Šฅ

7.1 ์ž‘์—… ์ƒ์„ฑํ•˜๊ธฐ

asyncio ๋ชจ๋“ˆ์—์„œ Task ํด๋ž˜์Šค๋Š” ์ฝ”๋ฃจํ‹ด ์‹คํ–‰์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. (Tasks)๋Š” ์ฝ”๋ฃจํ‹ด ๋ž˜ํผ๋กœ ์ฝ”๋ฃจํ‹ด์˜ ์‹คํ–‰์„ ์ œ์–ดํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. Task ํด๋ž˜์Šค๋Š” ์ฝ”๋ฃจํ‹ด์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

Task ํด๋ž˜์Šค์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ

Task ํด๋ž˜์Šค๋Š” ์ฝ”๋ฃจํ‹ด ์œ„์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์–ด๋–ค ๋ž˜ํผ์•ผ. ์ด๋Ÿฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์–ด:

์ฝ”๋ฃจํ‹ด ์‹คํ–‰ ๊ด€๋ฆฌ:

์ž‘์—…์€ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

์ž‘์—… ์ทจ์†Œ:

์ž‘์—…์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ Task๊ฐ€ ๊ธด ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๊ฒŒ ํ•ด์ค˜, ์™„๋ฃŒ ์ „์— ๋ฉˆ์ถฐ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์„ ๋•Œ.

์ฝœ๋ฐฑ:

์ž‘์—…์€ ์ฝœ๋ฐฑ ์ถ”๊ฐ€๋ฅผ ์ง€์›ํ•ด, ์ž‘์—…์ด ์™„๋ฃŒ๋์„ ๋•Œ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

์ž‘์—… ์ƒ์„ฑํ•˜๊ธฐ:

์ž‘์—…์€ asyncio.create_task(coroutine) ํ•จ์ˆ˜๋‚˜ loop.create_task(coroutine) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑ๋ผ, ์ด๋“ค์€ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰์„ ์˜ˆ์•ฝํ•ด์ค˜.


import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
async def main():
    task = asyncio.create_task(say_hello())
    await task
            
asyncio.run(main())

7.2 ์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ Task.cancel():

์ž‘์—…์„ ์ทจ์†Œํ•˜๋„๋ก ์š”์ฒญํ•ด. ์ž‘์—…์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด CancelledError ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ์ข…๋ฃŒ๋ผ.

์ด๋ฅผ ๋ณด์—ฌ์ค„ ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด์ž.

  1. 10์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ƒ์„ฑํ•ด๋ณด์ž
  2. ์ด๋ฅผ Task ๊ฐ์ฒด ์•ˆ์— ๋ž˜ํ•‘ํ•ด
  3. ์ž‘์—…์ด ์‹œ์ž‘๋˜๋„๋ก 1์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ ค๋ณด์ž
  4. ์ž‘์—…์„ ์ทจ์†Œํ•ด โ€“ task.cancel()
  5. ์ดํ›„ ์ž‘์—…์„ await ์—ฐ์‚ฐ์ž๋กœ ๊ธฐ๋‹ค๋ฆฌ๋ ค๊ณ  ํ•˜๋ฉด CancelledError ์˜ˆ์™ธ๋ฅผ ์–ป๊ฒŒ ๋  ๊ฑฐ์•ผ.

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task was cancelled")
            
asyncio.run(main())

๋ฉ”์„œ๋“œ Task.result():

์ž‘์—…์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ์ž‘์—…์ด ์˜ˆ์™ธ์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜๋ฉด result() ํ˜ธ์ถœ ์‹œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
    result = await task
    print(result)  # Output: Completed
            
asyncio.run(main())

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์–ด โ€” await ์—ฐ์‚ฐ์ž๊ฐ€ Task ๊ฐ์ฒด์™€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋‹ˆ๊นŒ. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด result() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด.

๋ฉ”์„œ๋“œ Task.exception():

์ž‘์—…์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ์ž‘์—…์ด ์˜ˆ์™ธ ์—†์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ None์„ ๋ฐ˜ํ™˜ํ•ด.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task failed with exception: {e}")

asyncio.run(main())

๋˜ํ•œ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์–ด โ€” ์ž‘์—…์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด await ์—ฐ์‚ฐ์ž๊ฐ€ exception() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฑฐ์•ผ.

๋ฉ”์„œ๋“œ Task.add_done_callback(callback):

์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋  ์ฝœ๋ฐฑ (callback)์„ ์ถ”๊ฐ€ํ•ด.


import asyncio

def callback(future):
    print("Task completed")
            
async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task
            
asyncio.run(main())

์ž‘์—…์ด ์™„๋ฃŒ๋์„ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๋ฅผ ์ž‘์—…์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ฝ”๋“œ๋ฅผ ๋งค์šฐ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜. ๊ฒŒ๋‹ค๊ฐ€ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์–ด๋–ค ์ž‘์—…์—๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด.

๋ฉ”์„œ๋“œ Task.done():

์ž‘์—…์ด ์™„๋ฃŒ๋์œผ๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ด (์„ฑ๊ณต์ ์œผ๋กœ, ์˜ค๋ฅ˜๋กœ, ๋˜๋Š” ์ทจ์†Œ๋์„ ๋•Œ).


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True
            
asyncio.run(main())

done() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ๋•Œ๋ฌธ์— ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ทจ์†Œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์—…์€ ์™„๋ฃŒ๋œ ๊ฑฐ์•ผ. ๋งŒ์•ฝ ์ž‘์—…์ด (cancel)๋กœ ์ทจ์†Œ๋๋‹ค๋ฉด ๋ฉ”์„œ๋“œ๋Š” False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ด.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION