jsup/avle 보팅 코드 갱신 - 1일1포스팅 강박에서 벗어나기

by joviansummer original STEEMIT post: https://steemit.com/blog/@joviansummer/jsup-avle-1-1 안녕하세요. @joviansummer입니다. @jsup과 @avle의 보팅 코드를 갱신하여 적용하였습니다. 검토는 상당히 오래전부터 진행해 왔습니다만, 최근에 구체적인 설계 방향이 잡히고 기술적으로 어떻게 할 것인지에 대해서도 결정이 되면서 생각보다 빠르게 코드 수정이 진행되었습니다. 새로운 기능은 신청자에 대해서 포스팅이 아니라 댓글에도 보팅을 하는 것입니다. 매일 포스팅하는 것이 부담스럽고 힘들다면 댓글을 달면 됩니다. 당연히 1일1포스팅보다 1일1댓글이 훨씬 쉽고, 댓글을 많이 쓴다고 나쁠 것도 없다고 생각됩니다. 임대 보팅을 받기 위해 억지로 매일 포스팅하는 것은 본인에게도 괴로운 일이고 포스팅 자체도 결국 저품질화될 가능성이 큽니다. 매일 포스팅하는 것이 즐거운 사용자들도 있겠습니다만, 단지 보팅 때문에 억지로 쥐어 짜서 하루에 하나씩 힘들게 포스팅하거나 사실상 내용이 없다시피 한 포스팅을 하는 사용자들도 있는 것이 현실입니다. 보팅을 받아야 한다는 압박감으로 매일 억지로 포스트를 쓰기 시작하면서 스팀잇은 재미 없고 따분한 곳이 되어 갑니다. 게다가 스팀잇의 트렌딩 페이지는 사실상 대량의 임대 셀프 보팅을 받는 사용자의 포스팅을 모아놓은 공간처럼 되어 있어, 이대로 계속 가면 SNS 본연의 매력은 상실하고 코인 채굴장 그 이상도 이하도 아니게 될까 우려되는 측면도 있습니다. 댓글 보팅이 이런 문제를 완화하는데 조금이나마 기여할 수 있지 않을까 생각됩니다. 대상: @jsup 또는 @avle에 스팀파워를 임대하여 보팅을 받고 있는 계정 신청 방법: @jsup 또는 @joviansummer의 최근 포스트에 "댓글 보팅을 신청합니다"라는 내용으로 댓글을 써 주시면 됩니다. 제가 확인하고 서버에 등록하면 다음날부터 해당 계정은 포스트/댓글 관계 없이 그날 처음 작성하...

파이썬 + 스팀: 반복적으로 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 - 파이썬 스크립트를 바이너리 실행 파일로 변환

[EN] STEEM-services: dapps/services webpage with sort and search functions

[ENG] jsup 2.0 - make your upvote great again