병렬성 (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

 

Coroutines and Tasks

This section outlines high-level asyncio APIs to work with coroutines and Tasks. Coroutines, Awaitables, Creating Tasks, Task Cancellation, Task Groups, Sleeping, Running Tasks Concurrently, Eager ...

docs.python.org

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

 

Event Loop

Source code: Lib/asyncio/events.py, Lib/asyncio/base_events.py Preface The event loop is the core of every asyncio application. Event loops run asynchronous tasks and callbacks, perform network IO ...

docs.python.org

https://brownbears.tistory.com/540

 

[Python] asyncio 파헤치기

asyncio는 파이썬 버전 별로 사용하는 형태가 조금씩 다릅니다. 아래 설명에서는 파이썬 3.8 기준으로 작성했습니다. asyncio란? 파이썬 3.5부터 지원하는 asyncio는 비동기 프로그래밍을 위한 모듈입니

brownbears.tistory.com

https://velog.io/@jaebig/python-%EB%8F%99%EC%8B%9C%EC%84%B1-%EA%B4%80%EB%A6%AC-3-%EC%BD%94%EB%A3%A8%ED%8B%B4Coroutine

 

python 동시성 관리 (3) - 코루틴(Coroutine)이란?

들어가기에 앞서 이번 시간에는 코루틴 개념에 관하여 알아보도록 하겠습니다. 프로세스(Process)와 스레드(Thread) 개념 Python GIL(Global Interpreter Lock) 코루틴(Coroutine) 동시성 관리 구현에 유용한 모듈

velog.io

'Language > Python' 카테고리의 다른 글

python GC(Garbage Collector)  (0) 2023.10.22