jm_p_op

비동기 병렬처리와 객체화 본문

py/Eternal Return 분석

비동기 병렬처리와 객체화

jm_p_op 2024. 3. 19. 17:12

비동기화 된 함수들은 병렬로 처리가 되지만 안에 인스턴스된 한 객체의 메서드를 사용한다면, 결국 동기화랑 다를것이 없다

  • 객체화된 메서드는 하나임으로 들어온 순서대로 처리
  • 즉 동기화된거랑 차이가 없다

 

import time
import asyncio

class T:
    def __init__(self) -> None:
        self.x=[]
    def add(self,n,i):
        self.x.append(n)
        time.sleep(1)
        print("sleep")
        print(f'{n}명 중 {i}번 째 사용자 조회 중 ...')
# async -> 비동기 함수로 변경
import time
import asyncio
# async -> 비동기 함수로 변경
t=T()
async def find_users_async(n):
    for i in range(1, n + 1):
        t.add(n,i)
        # asyncio.sleep 이 비동기 함수이므로 await 추가
        await asyncio.sleep(1)
    print(f'> 총 {n} 명 사용자 비동기 조회 완료!')

# async -> 비동기 함수로 변경
async def process_async():
    start = time.time()
    # asyncio.wait : 함수 호출을 알아서 스케줄링하여 비동기로 호출
    await asyncio.wait([
        # asyncio 모듈의 wait() 함수에 넘겨지는 coroutines(코루틴)이 명시적으로 tasks(태스크)로 전달되어야 하므로
        # asyncio.create_task() 함수를 사용하여 각 코루틴을 태스크로 변환해야 합니다.
        # 태스크 : 코루틴을 동시에 예약하는 데 사용.
        # 코루틴이 asyncio.create_task()와 같은 함수를 사용하여 태스크로 싸일 때 코루틴은 곧 실행되도록 자동으로 예약됨.
        asyncio.create_task(find_users_async(i)) for i in range(100)
    ])
    end = time.time()
    print(f'>>> 비동기 처리 총 소요 시간: {end - start}')

if __name__ == '__main__':
    asyncio.run(process_async())

참고 자료 : https://velog.io/@judy_choi/python-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%A5%BC-%EB%BF%8C%EC%85%94%EB%B3%B4%EC%9E%90