작성
·
327
0
안녕하세요. 강의 잘들었습니다!
강의 내용 토대로 비동기로 API 수집을 구현했었는데
API 서버가 제가 보낸 모든 요청을 처리하지못해 오류 발생하여 요청 수를 제어하려고 합니다.
예를 들어들어 각기 다른 파라미터로 서버에 요청해야 할 수가 총 1000번이라면
1초당 10개씩만 요청하려고 합니다.
이럴 경우에는 어떻게 구현하는게 좋을까요?
semaphore 사용해서 하는게 맞는건지 아님 aiohttp.BaseConnector 의 limit 수 파라미터를 조정하는게 맞는건지 궁금합니다.
https://docs.aiohttp.org/en/stable/client_reference.html#baseconnector
그리고 한번에 요청 보내는 수뿐만아니라 요청보내는 간격에 대해서도 제어하려면 어떻게하면 좋을지 의견부탁드립니다!
답변 1
0
강사님 답변이 없어서 이제서야 AI 를 통해 자문자답합니다 ㅎㅎ
[자문자답]
semaphore와 aiohttp.BaseConnector의 limit 파라미터는 각각 다른 목적으로 사용되며, 상황에 따라 둘 다 유용할 수 있습니다. 두 방법의 특징과 사용 목적을 비교해 보겠습니다.
## Semaphore 사용
Semaphore는 동시에 실행되는 작업의 수를 제어하는 데 사용됩니다.
- 장점:
- 전체 애플리케이션 수준에서 동시성을 제어할 수 있습니다.
- API 서버의 요청 제한을 준수하는 데 유용합니다.
- 다양한 리소스에 대한 접근을 제어할 수 있습니다.
- 사용 예:
```python
semaphore = asyncio.Semaphore(10)
async with semaphore:
# API 요청 코드
```
## aiohttp.BaseConnector의 limit 파라미터
이 방법은 HTTP 연결 풀의 크기를 제한합니다.
- 장점:
- HTTP 클라이언트 수준에서 동시 연결 수를 제어합니다.
- 네트워크 리소스 사용을 최적화할 수 있습니다.
- 연결 재사용을 통해 성능을 향상시킬 수 있습니다.
- 사용 예:
```python
connector = aiohttp.TCPConnector(limit=10)
async with aiohttp.ClientSession(connector=connector) as session:
# API 요청 코드
```
## 선택 기준
1. API 제한 준수: API 서버가 초당 요청 수를 제한한다면 Semaphore를 사용하는 것이 적합합니다[1][3].
2. 연결 관리: 전체 연결 수를 제어하고 싶다면 BaseConnector의 limit을 사용하는 것이 좋습니다.
3. 세밀한 제어: Semaphore를 사용하면 더 세밀한 수준에서 동시성을 제어할 수 있습니다[2].
4. 리소스 효율성: BaseConnector의 limit은 연결 풀을 효율적으로 관리하여 리소스 사용을 최적화합니다.
## 결론
두 방법을 함께 사용하는 것도 가능합니다. Semaphore로 전체 요청 속도를 제어하고, BaseConnector의 limit으로 연결 풀을 관리할 수 있습니다. 이렇게 하면 API 제한을 준수하면서도 효율적인 연결 관리가 가능합니다.
상황에 따라 적절한 방법을 선택하거나 두 방법을 조합하여 사용하는 것이 좋습니다. API 서버의 특성과 애플리케이션의 요구사항을 고려하여 결정하시기 바랍니다.
출처
[1] Unleashing the Power of Python Asyncio's Queue https://www.dataleadsfuture.com/unleashing-the-power-of-python-asyncios-queue/
[2] Mastering Synchronization Primitives in Python Asyncio https://www.dataleadsfuture.com/mastering-synchronization-primitives-in-python-asyncio-a-comprehensive-guide/
[3] Limit concurrency with semaphore in Python asyncio http://rednafi.com/python/limit_concurrency_with_semaphore/
[4] Semaphore can render asyncio.Queue redundant? https://stackoverflow.com/questions/75568749/semaphore-can-render-asyncio-queue-redundant
[5] What are the specific use-cases for threading over ... https://www.reddit.com/r/Python/comments/p726gm/what_are_the_specific_usecases_for_threading_over/
[6] What are the advantages of asyncio over threads? - Page 2 https://discuss.python.org/t/what-are-the-advantages-of-asyncio-over-threads/2112?page=2