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.
설명서의 동시성과 다중 스레딩 절을 참고하십시오.
'언어 정리 > python_비동기관련_lib' 카테고리의 다른 글
이벤트 루프_2 - 예제랑 같이 좀더 자세히 (0) | 2022.08.28 |
---|---|
다른사람 예제 rclpy.executors 랑 rclpy.task 관련 예시 퍼옴 (0) | 2022.08.17 |
코루틴과 태스크, 퓨처 - 파이썬 레퍼런스 정리 (0) | 2022.08.17 |
ThreadPool + 딕셔너리 컴프리헨션 (0) | 2022.07.31 |
asyncio.queue 를 쓰레드와 asyncio 사이에서 사용 하기 (1) | 2022.07.13 |
댓글