파이썬에서 datetime.timezone()을 이용한 시간대 설정

by joviansummer original STEEMIT post: https://steemit.com/blog/@joviansummer/datetime-timezone 파이썬에서 datetime.timezone()을 이용해서 datetime 객체의 시간대를 설정할 수 있습니다. 예를 들어 한국시간(KST)은 GMT+9시간이므로 아래와 같이 설정해서 현재 시각을 구할 수 있습니다. import datetime KST = datetime.timezone(datetime.timedelta(hours=9)) now_kst = datetime.datetime.now(tz=KST) 시간대 정보가 없는 datetime 객체의 경우에는 앞의 예제 코드에서 정의된 변수 KST를 이용해서 아래와 같이 시간대를 할당할 수 있습니다. # 시간대 정보 없는 UTC 기준 현재시각 가져오기 - utcnow() now = datetime.datetime.utcnow() # 시간대 정보 추가 now_kst = now.astimezone(KST) @joviansummer의 스팀 프로젝트 스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다. ( https://steemitwallet.com/~witnesses ) jswit 증인 노드 프로젝트를 시작합니다. jsup 업보팅(upvoting) 서비스 소개 jsup 수혜자 지정 기능 추가 jsup 2.0 - 업보팅을 다시 위대하게 jSTEEM 프로젝트 - 텔레그램 챗봇으로 구현하는 스팀 블럭체인 탐색기 Steemit-Search - 스팀잇 포스팅 검색 STEEM.NFT - 디지털 아트 보존 프로젝트

파이썬 + 스팀: 반복적으로 API 노드에 접속할 때 고려할 점

by joviansummer
original STEEMIT post: https://steemit.com/blog/@joviansummer/api


스팀 블럭체인으로부터 정보를 얻기 위해 API 노드에 요청을 보낼 경우, 일회성으로 접속하는 경우에는 별 문제가 없지만 while 또는 for 반복문을 통해서 반복 접속할 경우에는 응답이 제대로 오지 않을 수 있습니다.

예를 들어 특정 스팀 계정에 대한 어떤 정보를 조회하기 위한 함수 func_test()가 있다고 가정해 보겠습니다. 인자(argument)로 스팀 계정을 받아서 API 노드로부터 어떤 정보를 조회한 결과를 돌려주는 기능을 한다면, 아래와 같은 코드를 만들어 볼 수 있겠습니다.

steem_id = 'joviansummer'
result = func_test(steem_id)
print(result)

위의 경우에는 별 문제가 없지만, 예를 들어 100개의 스팀 계정을 리스트(list) 형식으로 가지고 있다면 이들의 정보를 조회하기 위해 아래와 같은 코드를 만들 수 있습니다.

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  result = func_test(steem_id)
  print(result)

코드 자체로는 전혀 문제가 없어 보이지만, 실제로 이러한 코드를 실행해 보면 API 노드에서 처음에는 정상적으로 응답이 오다가 어느 순간 제대로 응답이 오지 않는 경우가 발생할 수 있습니다. 아마도 한꺼번에 과도한 요청이 온다고 판단될 경우 접속에 제한을 하는 것으로 보입니다. 제대로 응답을 받지 못할 경우 API 접속 관련 파이썬 모듈에서 다섯번까지 재시도를 합니다만 결국 응답을 받지 못하는 경우도 발생합니다.

일단 첫번째로 생각해 볼 수 있는 해결책은 API 노드에 좀 더 공손하게(?) 요청을 하는 것입니다. time.sleep() 함수를 이용해서 각 요청마다 약간의 시간 지연을 추가해서 조금 천천히 요청을 보내는 것인데요. 이것만으로도 응답 수신 실패 가능성을 상당 부분 해결할 수 있습니다. 예를 들어 0.2초마다 한번씩 요청을 하려면 코드는 아래와 같이 되겠죠.

import time

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  result = func_test(steem_id)
  print(result)
  time.sleep(0.2)

그래도 안심이 되지 않는다면, 무한 루프를 이용해서 제대로 된 응답이 올 때까지 기다리게 할 수도 있겠습니다. 결과를 받은 후 결과의 내용을 검증하는 부분이 추가되어야 겠죠. 예를 들어 결과를 검증하는 함수를 chk_res()라는 이름으로 만들어서 문제가 없으면 "OK"를 반환하고 문제가 있으면 "ERROR"를 반환한다고 가정하면 코드가 아래와 같이 될 수 있습니다. 응답을 받은 결과가 정상이면 while 무한 루프를 빠져나오고, 문제가 있으면 5초후에 다시 시도하는 형태입니다.

import time

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  while True:
    result = func_test(steem_id)
    result_chk = chk_res(result)
    if result_chk == "OK":
      break
    else:
      time.sleep(5)
      continue
  print(result)
  time.sleep(0.2)

API 노드와 통신이 항상 완벽하다는 보장이 없기 때문에, 시험용이 아니라 실제로 사용할 목적으로 파이썬 코딩을 한다면 위와 같은 상황에 대한 고려가 반드시 필요합니다. 또한 위의 예시에서 func_test() 함수의 실제 내용에는 API 노드와 통신하는 부분이 포함될텐데, 이 부분에서도 예외(exception) 처리를 위한 코드가 반드시 필요합니다. 이와 관련된 내용은 이전에 작성한 포스트를 참고하시기 바랍니다.

파이썬 beem에서 인터넷 회선 또는 API 노드 불안정성에 대한 대응


@joviansummer의 스팀 프로젝트

스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다.
(https://steemitwallet.com/~witnesses)

jswit 증인 노드 프로젝트를 시작합니다.

jsup 업보팅(upvoting) 서비스 소개

jsup 수혜자 지정 기능 추가

jSTEEM 프로젝트 - 텔레그램 챗봇으로 구현하는 스팀 블럭체인 탐색기

STEEM.NFT - 디지털 아트 보존 프로젝트

Comments

Popular posts from this blog

Nuitka - 파이썬 스크립트를 바이너리 실행 파일로 변환

파이썬에서 스팀잇 ID 및 포스팅 키 유효성 확인

파이썬에서 시간대(timezone) 변경