개발

[python] await/asyncio.gather 비동기와 병렬처리

0hyeon의 2024. 3. 14. 14:18
반응형

 

1.await로직 + asyncio.gather

await self.prisma.ssg_dfinary.create(data=model_data)

await asyncio.gather(*tasks)

 

 

모든 작업을 병렬로 처리할 수 있습니다. 각 작업을 추가하고 asyncio.gather(*tasks)를 통해 모든 작업을 병렬로 실행함으로써 전체적인 처리 속도를 향상시킬 수 있습니다. 특히, 여러 작업 간에 의존성이 없는 경우에 적합합니다.

 

2. await로직

await self.prisma.ssg_dfinary.create(data=model_data)

 

각 작업이 순차적으로 실행되기 때문에 각 작업의 진행 상태를 명확하게 파악할 수 있습니다. 작업 간의 의존성이 있는 경우에 유용하며, 코드의 가독성이 높습니다. 또한, 작업이 한 번에 하나씩 처리되므로 메모리 사용량이 줄어들 수 있습니다.

 

 

3. tasks.append + await asyncio.gather

tasks.append(self.prisma.ssg_po.create(data=model_data))  + await asyncio.gather(*tasks)

 

여러 작업을 추가된 순서대로 하나씩 처리함으로써 작업의 처리 순서를 보장합니다. 이 방법은 작업 간의 의존성이 있는 경우에 유용합니다. 또한, 코드가 간결하며 직관적입니다.

 

4. semaphore + tasks.append + await asyncio.gather

semaphore = asyncio.Semaphore(10)
async with self.semaphore:
tasks.append
await asyncio.gather

 

Semaphore를 사용하여 동시에 실행되는 작업의 수를 제어할 수 있습니다. 이는 너무 많은 리소스가 동시에 사용되는 것을 방지하고, 시스템의 안정성을 유지하는 데 도움이 됩니다. 특히 네트워크 요청이나 데이터베이스 쿼리와 같은 IO-bound 작업을 처리할 때 유용합니다.

 
 
 

*4번사용의 경우 

Timed out fetching a new connection from the connection pool. More info: http://pris.ly/d/connection-pool (Current connection pool timeout: 10, connection limit: 5)

 

에러가 나올수도 있는데 이부분 트러블이슈 다음번에 작성토록 해봅니다.

반응형