๐ง functools ๋ชจ๋์ด๋?
functools ๋ชจ๋์ ๋ช ๊ฐ์ง ๊ณ ์ ํจ์๋ฅผ ํตํฉํ๋ค. ๊ทธ ์ค ๊ฐ์ฅ ๋๋ฆฌ ์๋ ค์ง ํจ์๊ฐ reduce() ํจ์์ด๋ค. functools์์ ์ ๊ณตํ๋ ๋๋จธ์ง ํจ์ ์ค partial() ๋ฐ ์ด์ ๋ณํ์ธ partialmethod() ํจ์๊ฐ ๋งค์ฐ ์ ์ฉํ๋ค๊ณ ํ๋ค.
โ๏ธ run_in_executor ์ ์ด์ฉํ functools.partial
functools.partial()์ ํจ์๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๊ณ ์ํจ์์ด๋ค. ์ด๋ค ํจ์๊ฐ ์์ ๋ partial()์ ์ ์ฉํ๋ฉด ์๋ ํจ์์ ์ผ๋ถ ์ธ์๋ฅผ ๊ณ ์ ํ ์ฝ๋ฌ๋ธ์ ์์ฑํ๋ค. ์ด ๊ธฐ๋ฒ์ ํ๋ ์ด์์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์๋ฅผ ๊ทธ๋ณด๋ค ์ ์ ์ธ์๋ฅผ ๋ฐ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ API์ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ๋น๋๊ธฐ ์ฒ๋ฆฌํ ๋ ๋ค์ดํฐ๋ธ ์ฝ๋ฃจํด ์์์ ๋ธ๋กํน I/O ํจ์(requests.post)๋ฅผ ์คํํ๊ธฐ ์ํด ์ด๋ฒคํธ ๋ฃจํ์ run_in_executor๋ฅผ ์ฌ์ฉํ๋๋ฐ run_in_executor์ ํจ์๋ ์ด๋ ๊ฒ ์๊ฒผ๋ค.
run_in_executor๋ ๋น๋๊ธฐ๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋๊ธฐ๋ก ์ด์ฉํ ์ ์๊ฒ ํด์ค๋ค.
def run_in_executor(self, executor, func, *args):
self._check_closed()
if self._debug:
self._check_callback(func, 'run_in_executor')
if executor is None:
executor = self._default_executor
# Only check when the default executor is being used
self._check_default_executor()
if executor is None:
executor = concurrent.futures.ThreadPoolExecutor(
thread_name_prefix='asyncio'
)
self._default_executor = executor
return futures.wrap_future(
executor.submit(func, *args), loop=self)
์ func ์ธ์ ์์ requests.post(url, params=params) ๋ฅผ ์คํํ๋ ํจ์๋ฅผ ๋ฃ๊ณ ์ถ์๋ค. ์ด๋ functools.partial()์ ์ฌ์ฉํ๋ค.
partial ํจ์๋ ๊ธฐ์กด ํจ์์ ๋์ผํ์ง๋ง ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ํด์ค ๋ ๋ค๋ฅธ ํจ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
async def post_test(type, day):
loop = asyncio.get_event_loop()
await loop.run_in_executor(None,
functools.partial(requests.post, url, params={'type': type, 'day': day}))
์ฆ functools.partial์ ์ด์ฉํด์
requests.post(url, params={'settlementType': settlementType, 'tradingDay': tradingDay})
์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์คํํ๊ฒ๋ ๋ง๋ ๊ฒ์ด๋ค.
๋๊ธ