์์ ํ์ํ ๋ฐฐ๊ฒฝ๋ค์ ๋ํด์ ์ด๋์ ๋ ์ดํด๋ณด๊ณ ๋๋ ๊ด๋ จ๋ ์๋ฃ๋ค์ ๋ณด๋๋ฐ ํจ์ฌ ์์ํจ์ ๋๊ผ๋ค.
์ฌ์ค asyncio์ ๋ํด ๊ณต๋ถํ๋ ๊ฒ = ๋ฐฐ๊ฒฝ์ง์ ๊ณต๋ถํ๊ธฐ ์ด๊ฒ์ธ ๊ฒ ๊ฐ๋ค.
์์ง ๋ถ์กฑํ ๊ฐ๋ ๋ค์ ์ถํ ํ์ํ ๋ฐฐ๊ฒฝ์ง์ ์๋ฆฌ์ฆ๋ก ์์ฑํด๋ณด๋๋ก ํ ๊ฒ์ด๋ค.
1. Asyncio๋?
- ์ผ๋จ Async (๋น๋๊ธฐ) + input/output (์ ์ถ๋ ฅ) ์ด๋ผ๋ ๋ป์ด๋ค.
- ๋น๋๊ธฐ๋ผ๋ ๊ฒ์ ์ด๋ฏธ์ง๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
- ๋๊ธฐ๋ ์์ 1์ด ๋๋๋ ๊ฒ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์์ 2๋ฅผ ํ๋ ๋ฐ๋ฉด ๋น๋๊ธฐ๋ ์์ 1์ด ์งํ๋๋ ๋์ ์์ 2๋ ํ ์ ์๋ค. ๊ฐ์์ ์ผ๋ก๋ง ๋ด๋ ์๊ฐ์ด ํ์ ํ ์ ์ฝ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
- ๊ทธ๋ผ ์ io(์ ์ถ๋ ฅ)์ด๋๋ฉด CPU๊ฐ ํ์์ ๋ฉ๋ชจ๋ฆฌ ์ฅ์น๋ค๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์๋ ์ฐจ์ด๋ก ์ธํด CPU์ ์์ ์ฒ๋ฆฌ ์๊ฐ์ด ์ง์ฐ๋๋ ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด DMA๋ฅผ ๋ฃ์ด iocontroller์ ์ญํ ์ ํ๊ฒํจ์ผ๋ก์จ CPU๊ฐ ๋ฐ์ดํฐ ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ํ์ง ์๊ณ ๋ค๋ฅธ ์ผ์ ํ ์ ์๋๋ก ๋ง๋ ๊ฒ์์ ๋น๋กฏ๋์๋ค. ์ฆ, ์ด ๋ง์ Asyncio๋ CPU๊ณ์ฐ์ด ๋ง์ด ๋ค์ด๊ฐ๋ ๋ชจ๋์์๋ ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ์ง๋ง, ํต์ ๊ณผ ๊ฐ์ io์์ ์ด ์ฃผ๋ก ์๋ ๋ชจ๋์์๋ ํจ์จ์ฑ์ด ๊ทน๋ํ๋๋ค๋ ๊ฒ์ด๋ค.
2. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
- ์น ์๋ฒ์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด๋ณด๋ฉด CPU ์ฐ์ฐ ์๊ฐ ๋๋น DB๋ API์ ์ฐ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋๊ธฐ ์๊ฐ์ด ํจ์ฌ ๊ธธ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฌํ ๋๊ธฐ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ๊ทธ ์๊ฐ์ CPU๊ฐ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ํ๋๋ฐ ์ด๋ฅผ ํํ non-blockingํ๋ค๊ณ ํ๋ค. ์ถํ ์์ธํ ๋ด์ฉ์ ํฌ์คํ ์ ํตํด ๋ ๊ณต๋ถํ๋๋ก ํ ๊ฒ์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ํ์ ์ผ๋ก ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ก ์ค๊ณ๋ ์ธ์ด์ด๊ณ , ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ด ๊ฐ๋ฐ ๋ฐฉ์์ ํ์๋ก ํ๋๋จ์ ๋ฐ๋ผ JS๋ ๋๋ถ์ ๋ฌ ๊ฒ ์๋๊ฐ ์ถ๋ค. ์ฌํผ, ๊ฐ์คํ๊ณ ํ์ด์ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ๋ฐฉ์์ ์ธ์ด์ด๋, asyncio ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ถ๊ฐ๋ ์ดํ, ํ์ด์ฌ๋ ์ธ์ด ์์ฒด๋ก ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ตฌํ์ด ๊ฐ๋ฅํด์ก๋ค.
3. ํต์ฌ ๋ฌธ๋ฒ
(1) async/await
- ํจ์ ์์ async๋ฅผ ๋ถ์ฌ ์ฝ๋ฃจํด์ ์ ์ธํ๊ณ , await๋ฅผ ๋ถ์ฌ ํด๋น ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํด์ผํ๋ค.
(2) ๋ฃจํ
- async๋ก ์ ์ธ๋์ง ์์ ์ผ๋ฐ ๋๊ธฐ ํจ์ ๋ด์์ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด asyncio ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ด์ฉํด์ผํ๋ค.
loop = asyncio.get_event_loop()
loop.run_until_complete(main_async())
loop.close()
(3) ํธ์ถ
- ํ์ด์ฌ 3.7 ์ด์๋ถํฐ ๊ฐ๋จํ asyncio.run(main_async()) ์ ๊ฐ์ ์ฝ๋๋ก ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
(4) asyncio.sleep()
- time.sleep ํจ์๋ ๊ธฐ๋ค๋ฆฌ๋ ๋์ CPU๋ฅผ ๊ทธ๋ฅ ๋๋ฆฌ๋ ๋ฐ๋ฉด์, asyncio.sleep ํจ์๋ CPU๊ฐ ๋์ง ์๊ณ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ํด์ค๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ asyncio.sleep ์์ฒด๋ ๋น๋๊ธฐ ํจ์์ด๊ธฐ ๋๋ฌธ์ ํธ์ถํ ๋ ๋ฐ๋์ await ํค์๋๋ฅผ ๋ถ์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
(5) asyncio.gather()
- gather ํจ์๋ฅผ ํตํด ์ฌ๋ฌ๊ฐ์ ์ด์จ์ดํฐ๋ธ ๊ฐ์ฒด๋ฅผ ๋์์ ์คํํ๋ค.
- ์ด ์ด์จ์ดํฐ๋ธ ๊ฐ์ฒด๊ฐ ์ฝ๋ฃจํด์ด๋ฉด ์๋์ผ๋ก ํ์คํฌ๋ก ์์ฝ๋๋ค.