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
์์ธ๋ฅผ ๋ฐ์์ํค๋ฉฐ ์ข
๋ฃ๋ผ.
์ด๋ฅผ ๋ณด์ฌ์ค ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์.
10์ด ๋์ ๋๊ธฐํ๋ ๋น๋๊ธฐ ์์ ์ ์์ฑํด๋ณด์
์ด๋ฅผ
Task
๊ฐ์ฒด ์์ ๋ํํด์์ ์ด ์์๋๋๋ก 1์ด๋ฅผ ๊ธฐ๋ค๋ ค๋ณด์
์์ ์ ์ทจ์ํด โ
task.cancel()
-
์ดํ ์์ ์
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
๋ฅผ ๋ฐํํด.
GO TO FULL VERSION