병렬성 (Parallelism)
task1 ======
task2 ======
task3 ======
실제 동시에 수행
동시성 (Concurrency)
task1 === ===
task2 === ===
task3 === ===
실제 동시에 수행하진 않고 여러 task를 진행
coroutine
co(협동) + routine = 메인 루틴과 동등한 관계를 가진 루틴으로 메인 루틴과 함께 순차적으로 실행된다.
asyncio 애플리케이션을 작성하는데 선호되는 방법이다.
서브루틴과 차이는 실행 후 종료되는게 아닌 대기(suspend) 상태가 가능하다는 것, 그래서 동등한 관계라 말한다.
별도의 쓰레드에서 실행되는게 아니므로 문맥 교환 비용이 발생하지 않는다.
asyncio
코루틴을 기반으로 비동기 프로그래밍을 위한 모듈이다.
대기(suspend)가 가능하기에 동시성 프로그래밍이 가능하다.
응용 프로그램 개발자는 일반적으로 asyncio.run()과 같은 고수준의 asyncio 함수를 사용해야 하며, 루프 객체를 참조하거나 메서드를 호출할 필요가 거의 없습니다. 이 절은 주로 이벤트 루프 동작을 세부적으로 제어해야 하는 저수준 코드, 라이브러리 및 프레임워크의 작성자를 대상으로 합니다.
def run(main, *, debug=None):
...
loop = events.new_event_loop()
try:
events.set_event_loop(loop)
if debug is not None:
loop.set_debug(debug)
return loop.run_until_complete(main)
finally:
try:
_cancel_all_tasks(loop)
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
events.set_event_loop(None)
loop.close()
asyncio.run() 함수 안에는 loop의 생성과 실행이 들어가 있다.
# ComfyUi
...
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
...
try:
loop.run_until_complete(...)
....
ComfyUi를 보면 run()이 아닌 loop를 직접 사용하는데 다중 쓰레딩에서 하나의 asyncio loop를 공유하는 구조이기 때문에 loop 객체를 이곳저곳 활용하기 위함인 것 같다.
그리고 멀티 쓰레딩에서 같은 자원을 공유한다면 '쓰레드의 동기화' 를 고려하는데 loop는 그러한 메서드를 제공하는 듯 보인다.
참고 자료
https://docs.python.org/ko/3/library/asyncio-task.html#awaitables
https://docs.python.org/ko/3/library/asyncio-eventloop.html#event-loop-methods
'Language > Python' 카테고리의 다른 글
python GC(Garbage Collector) (0) | 2023.10.22 |
---|