J.BF Story

[Python] Python Protocol Package Timeout (requests / urllib / ftplib / paramiko) 본문

BackEnd/Python

[Python] Python Protocol Package Timeout (requests / urllib / ftplib / paramiko)

J.BF 2022. 6. 9. 23:42

Timeout

  • 클라이언트에서 서버로 request를 보낸 후 일정 시간이 지나도 response가 오지 않을 때 더 기다리지 않고 중단하는 것.
  • timeout을 설정하지 않으면 무한대로 response를 기다릴 수도 있다.
  • ex) timeout을 30초로 설정했을 경우
    -> 클라이언트에서 request를 보냈으나 서버에서 30초 이상 response가 오지 않으면 기다림 중단

 

 

Protocol Package

HTTP: requests, urllib

FTP: ftplib

SFTP: paramiko

 

 

Timeout 기본값

requests urllib ftplib paramiko
제한 없음
- 공식 문서
socket._GLOBAL_DEFAULT_TIMEOUT 사용
- 공식 문서
socket._GLOBAL_DEFAULT_TIMEOUT 사용
- 공식 문서
None (제한 없음?)
- 공식 문서

** socket._GLOBAL_DEFAULT_TIMEOUT 값 알아내기: getdefaulttimeout() 사용

import socket
print(socket.getdefaulttimeout())
  • float 또는 None을 반환
  • float: 초 단위 timeout / None: 제한 없음
  • 공식문서

 

Timeout 사용법

requests

import requests

requests.get(url, timeout=30)

 

urllib

import urllib.request as urllib

fp = urllib.urlopen(url, timeout=30)

 

ftplib

from ftplib import FTP


ftp = FTP(timeout=30)
ftp.connect(host, port)
ftp.login(user=id, passwd=pw)

 

paramiko

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=host, port=port, username=id, password=pw, timeout=30)
sftp = ssh.open_sftp()

 

 

결론

  • 대부분의 Python Protocol Package는 timeout을 설정해주지 않으면 기본적으로 제한 없음으로 동작한다.
  • timeout을 설정하지 않아서 프로그램이 동작은 되고있으나 다음 작업으로 넘어가지 못한 채 멈춰버린 경우가 있었다.
    (timeout이 원인인지 몰랐을 때에는 로그를 남겨도 문제를 찾기 어려웠다..)
  • Python Protocol Package를 사용할 때 timeout을 명확히 설정해주자.
Comments