그래서 API에서 지속적으로 데이터를 수집 한 다음 주기적으로 (예 : 1 분마다) Excel 파일에 저장하는 Python 스크립트가 있습니다. 이를 위해 24/7 코드를 실행하는 VPS가 있습니다. 여러 소스의 데이터가 필요하고 서로 다른 빈도로 업데이트해야하므로 내 솔루션은 각 데이터 유형에 대해 별도의 함수를 만든 다음 모든 데이터를 별도의 스레드에서 호출하는 것이 었습니다.
예를 들어 다음 중 하나가 있습니다.
def ExchangeRateCheck(self):
while True:
try:
self.exchangeRate = self.oanda.get_prices(instruments="AUD_USD").get('prices')[0]['ask']
except:
try:
self.exchangeRate = requests.get('http://free.currencyconverterapi.com/api/v3/convert?q=AUD_USD').json()['results']['AUD_USD']['val']
except:
pass
time.sleep(30)
ratethread = threading.Thread(target=self.ExchangeRateCheck, args=())
ratethread.daemon = True
ratethread.start()
API에 도달 할 수없는 시간을 고려하기 위해 모든 것이 try / except 절에 중첩됩니다. 그러나 내가 찾은 것은 일부 스레드가 알려지지 않은 이유로 특정 지점에서 여전히 종료된다는 것입니다.
내 질문은 다음과 같습니다.이 유형의 작업은 원격 VPS를 사용하고 while True 루프에서 별도의 기능을 사용하는 것이 최상의 솔루션입니까? 연중 무휴 24 시간 데이터를 수집하는 더 좋은 방법이 있습니까? 코드 실행이 중단되지 않도록 예외를 더 잘 처리 할 수 있습니까?
내가 전문 개발자가 아니라고 말할 수 있듯이 모든 피드백은 높이 평가됩니다.
이것이 "최상의"방법입니까? 조건에 따라서. 솔직히이 모든 작업을 단일 스레드에서 수행 할 수는 있지만 http 요청을 만드는 데 걸리는 시간 때문에 시간이 약간 다를 수 있습니다.
그러나 몇 가지 유의해야 할 사항이 있습니다.
당신은 try / except를 사용하고 있습니다. 이것은 좋은 것입니다. 그러나 당신은 특정한 오류를 특별히 받아들이지 않습니다. 이것은 일종의 나쁜 것입니다. 허용 할 오류 (예 : 서버에 연결할 수없는 오류, 유효하지 않은 json 콘텐츠 등)를 지정해야합니다. 알 수없는 오류를 제외하고 다음과 같이 다른 작업을 수행 할 수도 있습니다.
try : do_something_here () madeUpError as e : print ( "Handled the made up error.") 제외 예외 as e : Print ( "뭔가 예기치 않은 일이 발생했습니다 : {}". format (e))
데몬 스레드를 사용하고 있습니다. 데몬 스레드를 사용하면 프로그램을 먼저 중지하지 않고 종료 할 수 있습니다. 즉, 메인 스레드가 종료되면 전체 프로그램도 종료됩니다. 나는 이것이 당신이 원하는 것이라고 생각하지 않으며 프로그램이 1 초 이상 실행되고 종료되기 때문에 메인 스레드에서 무언가를하고 있다고 가정합니다. 데이터 검색 작업자가 데몬 인 특별한 이유가 있습니까?
while True:
threading.Event를 사용할 수 있습니다. 이것은 모든 워커가 종료되기를 원할 때 메인 스레드가 설정할 수있는 플래그입니다. 주 스레드는 KeyboardInterrupt를 제외하고 try /를 실행할 수 있으며, except 핸들러에서 해당 이벤트를 .set ()하여 작업자가 현재 수행중인 작업을 완료하면 종료하도록 지시 할 수 있습니다.도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다