반응형
Connection reset by peer 오류는 서버와의 연결이 끊어졌을 때 발생하는 일반적인 오류이다. httpx에서 이 오류가 발생하는 경우 다음과 같은 몇 가지 해결 방법을 시도해 볼 수 있다.
여기에서는 HTTPX 를 이용하지만, Requests 라이브러리에서도 동일하게 조치가 가능하다.
서버 환경 설정등 확인해야 할 것이 많지만, 기본적으로 확인해야 하는 요소는 다음 3가지이다.
timeout
keep-alive
연결 재시도
1. 연결 시간 제한 확인
timeout 매개변수를 사용하여 연결 시간 제한을 늘리면, 서버가 처리하지 못하는 상황에 보다 대기시간을 가져서 처리를 할 수 있다.
httpx
import httpx
client = httpx.Client(timeout=10) # 연결 시간 제한을 10초로 설정
try:
response = client.get("https://www.example.com")
except httpx.HTTPError as e:
if e.response is not None:
print(e.response.status_code)
else:
print(e)
requests
import requests
try:
response = requests.get("https://www.example.com", timeout=10) # 연결 시간 제한을 10초로 설정
except requests.exceptions.ConnectionError as e:
print(e)
2. keep-alive 연결 사용
Keep-alive를 사용하면 기존 연결된 세션을 재활용할 수 있어서 세션 연결에 대한 서버 부담을 줄여줄 수 있다.
httpx의 경우 keep-alive 설정을 Limit 설정을 통해서 진행 할 수 있다.
기본값은 max_keepalive_connections=20, max_connections=100, keealive_expiry=5 이므로 본인 서버에 맞게 조정하면 된다.
httpx
import httpx
httpx_keepalive = httpx.Limit(max_keepalive_connections=50, max_connections=250, keealive_expiry=10)
client = httpx.Client(limits=httpx_keepalive)
try:
response = client.get("https://www.example.com")
# ...
response = client.get("https://www.example.com/other-page")
except httpx.HTTPError as e:
if e.response is not None:
print(e.response.status_code)
else:
print(e)
requests
import requests
session = requests.Session()
session.keep_alive = True
try:
response = session.get("https://www.example.com")
# ...
response = session.get("https://www.example.com/other-page")
except requests.exceptions.ConnectionError as e:
print(e)
3. 연결 재시도 하기
서버에서 연결을 끊었을 때 자동으로 재시도를 진행하도록 하면, 연결 가능이 보다 올라가게 된다.
httpx
import httpx
httpx_trans = httpx.HTTPTransport(retries=5)
client = httpx.Client(transport=httpx_trans)
try:
response = client.get("https://www.example.com")
# ...
response = client.get("https://www.example.com/other-page")
except httpx.HTTPError as e:
if e.response is not None:
print(e.response.status_code)
else:
print(e)
requests
import requests
session = requests.Session()
session.retries = 3
try:
response = session.get("https://www.example.com")
except requests.exceptions.ConnectionError as e:
print(e)
반응형
'Python' 카테고리의 다른 글
Python - 에러 해결: list indices must be integers or slices, not str (0) | 2024.02.20 |
---|---|
Python - 함수 타입 지정, 타입 힌트(Type Hint)에 대해 (0) | 2024.02.20 |
Python - SQLAlchemy로 row 업데이트(update) 방법 3가지 (0) | 2024.02.19 |
Python - SQLAlchemy 검색 결과 (exists/ not exists)있는지/없는지 확인 (0) | 2024.02.19 |
Python - 임포트 함수 참조 순서 (0) | 2024.02.19 |