본문 바로가기
언어 정리/python_비동기관련_lib

이벤트 루프 - 파이썬 레퍼런스 정리

by 알 수 없는 사용자 2022. 8. 17.

https://docs.python.org/ko/3/library/asyncio-eventloop.html#asyncio.loop.call_soon

 

이벤트 루프 — Python 3.10.6 문서

이벤트 루프 소스 코드: Lib/asyncio/events.py, Lib/asyncio/base_events.py 머리말 이벤트 루프는 모든 asyncio 응용 프로그램의 핵심입니다. 이벤트 루프는 비동기 태스크 및 콜백을 실행하고 네트워크 IO 연산

docs.python.org

 


선행개념 :

이벤트 루프란 "?"

이벤트 루프는 모든 asyncio 응용 프로그램의 핵심입니다. 이벤트 루프는 비동기 태스크 및 콜백을 실행하고 네트워크 IO 연산을 수행하며 자식 프로세스를 실행합니다.

응용 프로그램 개발자는 일반적으로 asyncio.run()과 같은 고수준의 asyncio 함수를 사용해야 하며, 루프 객체를 참조하거나 메서드를 호출할 필요가 거의 없습니다. 이 절은 주로 이벤트 루프 동작을 세부적으로 제어해야 하는 저수준 코드, 라이브러리 및 프레임워크의 작성자를 대상으로 합니다.

-- 내용이 좀 하드한듯

 

솔직히 이부분은 사실 예제가 따로 필요 없다.

_loop = asyncio.new_event_loop()
asyncio.set_event_loop(_loop)
_loop.run_until_complete(self.main())

대표적인 예로 이런 형식으로 필요 함수 그냥 끌어다 적절히 써야함.

이론적인 개념이 필요한 부분


코루틴 코드 랑 이벤트루프 그림

 

import asyncio

TIMES = 5

async def coro1():
    for _ in range(TIMES):
        await asyncio.sleep(1)
        print("coro1()")

async def coro2():
    for _ in range(TIMES):
        await asyncio.sleep(2)
        print ("coro2()")

async def main():
    task1 = asyncio.create_task(coro1())
    task2 = asyncio.create_task(coro2())
    await task1
    await task2

asyncio.run(main())

 


asyncio.get_running_loop()

현재 OS 스레드에서 실행 중인 이벤트 루프를 반환합니다.

실행 중인 이벤트 루프가 없으면 RuntimeError가 발생합니다

 

 

asyncio.get_event_loop()

현재의 이벤트 루프를 가져옵니다.

현재 OS 스레드에 현재 이벤트 루프가 설정되어 있지 않고, OS 스레드가 메인이고, set_event_loop()가 아직 호출되지 않았으면, asyncio는 새 이벤트 루프를 만들어 현재 이벤트 루프로 설정합니다.

 

get_running_loop() VS get_event_loop()

 

asyncio.set_event_loop(loop)

loop를 현재 OS 스레드의 현재 이벤트 루프로 설정합니다.

 

 

asyncio.new_event_loop()

Create and return a new event loop object.

_loop = asyncio.new_event_loop()

 

 

loop.run_until_complete(future)

future(Future의 인스턴스)가 완료할 때까지 실행합니다.

" future 인스턴스 == Task 객체 " // Task 객체는 " _task_1 = asyncio.create_task(코루틴함수) " 리턴값인 _taks_1

하지만 코루틴 함수를 future에 넣어도 묵시적으로 Task로 변환해서 예약시킴

 

 

loop.run_forever()

stop()가 호출될 때까지 이벤트 루프를 실행합니다.

 

 

loop.stop()

이벤트 루프를 중지합니다.

 

 

loop.is_running()

이벤트 루프가 현재 실행 중이면 True 를 반환합니다.

loop.is_closed()

이벤트 루프가 닫혔으면 True 를 반환합니다.

loop.close()

이벤트 루프를 닫습니다.

 

==============================여기서부터 정리 필요=====================================

loop.call_soon(callback, *args, context=None)

이벤트 루프의 다음 이터레이션 때 args 인자로 호출할 callback 콜백을 예약합니다.

콜백은 등록된 순서대로 호출됩니다. 각 콜백은 정확히 한 번 호출됩니다.

선택적인 키워드 전용 context 인자는 callback 을 실행할 사용자 정의 contextvars.Context 를 지정할 수 있게 합니다. context 가 제공되지 않을 때는 현재 컨텍스트가 사용됩니다.

asyncio.Handle 인스턴스가 반환되는데, 나중에 콜백을 취소하는 데 사용할 수 있습니다.

이 메서드는 스레드 안전하지 않습니다.

 

loop.call_soon_threadsafe(callback, *args, context=None)

스레드 안전한 call_soon() 변형입니다. 다른 스레드에서 콜백을 예약하는 데 사용해야 합니다.

Raises RuntimeError if called on a loop that’s been closed. This can happen on a secondary thread when the main application is shutting down.

설명서의 동시성과 다중 스레딩 절을 참고하십시오.

 

 

 

 

 

 

댓글