Event Loop

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

6.1 ์ด๋ฒคํŠธ ๋ฃจํ”„ ์–ป๊ธฐ

์ด๋ฒคํŠธ ๋ฃจํ”„ (Event Loop) ๋Š” Python์˜ asyncio ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ค‘์‹ฌ ์š”์†Œ์•ผ. ์ด๊ฑด ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ์ฒ˜๋ฆฌ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ž…์ถœ๋ ฅ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์—ฌ๋Ÿฌ ํƒœ์Šคํฌ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋„๋ก ํ•ด์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ง‰ํžˆ์ง€ ์•Š๋„๋ก ๋„์™€์ค˜.

์ด๋ฒคํŠธ ๋ฃจํ”„ ์ƒ์„ฑ ๋ฐ ์–ป๊ธฐ

  • asyncio.get_event_loop(): ํ˜„์žฌ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ค˜.
  • asyncio.new_event_loop(): ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค์–ด.
  • asyncio.set_event_loop(loop): ์ง€์ •๋œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ˜„์žฌ ๋ฃจํ”„๋กœ ์„ค์ •ํ•ด.

์˜ˆ์‹œ:

asyncio์—๋Š” ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ํƒœ์Šคํฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํ˜„์žฌ์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์žˆ์–ด. ์ด ๋ฃจํ”„๋ฅผ ์–ป๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ํ˜„์žฌ ๋ฃจํ”„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ.


import asyncio

loop = asyncio.get_event_loop()
print(loop)  # ํ˜„์žฌ ์ด๋ฒคํŠธ ๋ฃจํ”„
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
print(asyncio.get_event_loop())  # ์ƒˆ๋กœ ์„ค์ •๋œ ์ด๋ฒคํŠธ ๋ฃจํ”„

get_event_loop() ๋ฉ”์†Œ๋“œ๋Š” ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋น„๋™๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

์ด๋ฒคํŠธ ๋ฃจํ”„ ์‹คํ–‰ํ•˜๊ธฐ

  • run_forever(): ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  stop()์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ง„ํ–‰ํ•ด.
  • run_until_complete(future): ์ฃผ์–ด์ง„ ์ฝ”๋ฃจํ‹ด์ด๋‚˜ future ๊ฐ์ฒด๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ด.

์˜ˆ์‹œ:

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด: ๋ฌดํ•œํžˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ โ€” while True ๊ฐ™์€ ๊ฑฐ, ์•„๋‹ˆ๋ฉด ํŠน์ • ํƒœ์Šคํฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€.


import asyncio

async def hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

๋งŒ์•ฝ Event Loop๋ฅผ run_forever() ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฉด, ์ด๊ฒƒ์€ ๋‚ด๋ถ€์—์„œ ๋ฌดํ•œํžˆ ๋ฃจํ”„๋ฅผ ๋Œ๊ฒŒ ๋  ๊ฑฐ์•ผ. run_forever() ๋ฉ”์†Œ๋“œ๋Š” ์–ด๋–ค ๋น„๋™๊ธฐ ํƒœ์Šคํฌ๊ฐ€ EventLoop์˜ stop() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„.

์ด๋ฒคํŠธ ๋ฃจํ”„ ์ค‘์ง€ํ•˜๊ธฐ

  • stop(): ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ค‘์ง€ํ•ด.
  • is_running(): ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ด.

์˜ˆ์‹œ:

๋ฌดํ•œ ๋ชจ๋“œ์—์„œ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด ํƒœ์Šคํฌ๋ฅผ ๊ณ„์† ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•ด, ๊ทธ๋ž˜์„œ ์ž์ฒด์ ์œผ๋กœ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š์•„. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ˜„์žฌ ๋ฃจํ”„์˜ ๊ฐ์ฒด๋ฅผ ์–ป๊ณ  stop() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ด. ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„  is_running() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ด.


import asyncio
            
loop = asyncio.get_event_loop()
loop.stop()
print(loop.is_running())  # False

6.2 ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์ค‘์š”ํ•œ ๋ฉ”์†Œ๋“œ

call_soon(callback, *args) ๋ฉ”์†Œ๋“œ

๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ callback ํ•จ์ˆ˜์™€ *args ์ธ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ณ„ํšํ•ด.


import asyncio

def my_callback():
    print("Callback executed")
            
loop = asyncio.get_event_loop()
loop.call_soon(my_callback)
loop.run_forever()

callback ํ•จ์ˆ˜๋ฅผ ํƒœ์Šคํฌ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋„ฃ์–ด์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋„๋ก ํ•ด. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด. ๋น„๋™๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฆ‰์‹œ ์‘๋‹ต์ด ํ•„์š”ํ•  ๋•Œ ์ด ๋ฉ”์†Œ๋“œ๋Š” ์œ ์šฉํ•ด.

call_later(delay, callback, *args) ๋ฉ”์†Œ๋“œ

delay ์ดˆ ํ›„์— callback ํ•จ์ˆ˜์™€ *args ์ธ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ณ„ํšํ•ด.


import asyncio

def my_callback():
    print("Callback executed after delay")
            
loop = asyncio.get_event_loop()
loop.call_later(2, my_callback)
loop.run_forever()

์ด ๋ฉ”์†Œ๋“œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ง€์—ฐํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜: ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ดˆ ๋‹จ์œ„์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋ฐ›์ง€ (์†Œ์ˆ˜์  ๊ฐ€๋Šฅ), ๊ทธ๋‹ค์Œ์—” ํ•จ์ˆ˜์™€ ๊ทธ ์ธ์ž๋ฅผ ๋ฐ›์•„. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์–‘ํ•œ ์šฐ์„ ์ˆœ์œ„๋กœ ํƒœ์Šคํฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ด, ํŠนํžˆ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ง์ด์•ผ.

call_at(when, callback, *args) ๋ฉ”์†Œ๋“œ

when ์‹œ๊ฐ„์— callback ํ•จ์ˆ˜์™€ *args ์ธ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ณ„ํšํ•ด.


import asyncio
import time
            
def my_callback():
    print("Callback executed at specific time")
            
loop = asyncio.get_event_loop()
when = loop.time() + 2  # ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ๋ถ€ํ„ฐ 2์ดˆ ํ›„
loop.call_at(when, my_callback)
loop.run_forever()

5์ดˆ ํ›„๊ฐ€ ์•„๋‹ˆ๋ผ, ์˜ˆ๋ฅผ ๋“ค์–ด 15:00์ด๋‚˜ 24:00์— ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, call_at() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ์ด๊ฑด call_soon() ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์—ฐ ์‹œ๊ฐ„ ๋Œ€์‹  ํŠน์ • ํ˜ธ์ถœํ•  ์‹œ๊ฐ„์„ ๋ฐ›์•„. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด.

์žฅ์  ๋ฐ ํŠน์ง•

๋น„๋™๊ธฐ ์‹คํ–‰: ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰์ง€ ์•Š๊ณ  ๋™์‹œ์— ๋งŽ์€ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค˜.

ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ๋ธ”๋ก ์—†์ด ์ˆ˜ํ–‰๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜.

์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ: ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋งŽ์€ ํƒœ์Šคํฌ ์Šค์ผ€์ค„๋ง๊ณผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ด์„œ ๋ณต์žกํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋น„๋™๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

6.3 ํƒœ์Šคํฌ ๋ฐ Future ๊ฐ์ฒด์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํƒœ์Šคํฌ (Tasks)์™€ ๋ฏธ๋ž˜์˜ ๊ฐ์ฒด (Futures)์˜ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•ด. ๋ฃจํ”„๋Š” ๊ทธ๋“ค์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์ค€๋น„๊ฐ€ ๋˜๋ฉด ์‹คํ–‰์„ ๋ณด์žฅํ•ด ์ค˜.

์˜ˆ์‹œ:


import asyncio

async def main():
    await asyncio.sleep(1)
    print("Task completed")
            
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

์ด ์˜ˆ์‹œ์—์„œ๋Š” create_task ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑ๋œ ํƒœ์Šคํฌ์˜ ์‹คํ–‰์„ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค˜. call_soon(), call_later(), ๊ทธ๋ฆฌ๊ณ  call_at() ๋ฉ”์†Œ๋“œ๋“ค์€ ๋‹ค์–‘ํ•œ ์šฐ์„ ์ˆœ์œ„๋กœ ํƒœ์Šคํฌ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ด, ํŠนํžˆ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ง์ด์•ผ.

1
ะžะฟั€ะพั
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ,ย  25 ัƒั€ะพะฒะตะฝัŒ,ย  5 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION