2014-01-30 4 views
0

저는 웹 서비스에 대한 호출을 처리 할 파이썬을 코딩하고 있습니다.Python - 액세스 할 수없는 경우 webservice를 처리하는 방법?

def calculate(self): 
    market_supply_price = self.__price_to_pay_current_market_supply() 
    market_supply_price_usd = market_supply_price.get('usd') 
    market_supply_price_eur = market_supply_price.get('eur') 
    amount = '%.8f' % ((self.euro - ((self.euro*self.__tax_to_apply())+self.__extra_tax_to_apply()))/market_supply_price_eur) 
    return {'usd': [market_supply_price_usd, amount], 'eur': [market_supply_price_eur, amount]} 

웹 서비스에 대한 호출이 줄에 :

market_supply_price = self.__price_to_pay_current_market_supply() 

이 개인 방법은 웹 서비스에 다양한 호출을 수행하고 그 결과를 돌려줘. 내 문제는이 웹 서비스가 많이 실패한다는 것입니다. 호출 중 하나가 실패하면 10 분을 기다렸다가 다시 시도하는 방법을 구현해야합니다. 10 분 후에 다시 실패하면 30 분을 기다렸다가 다시 시도하고 30 분 후에 다시 실패하면 구현할 것입니다. 60 분을 기다리십시오 ...

calculate() 메소드에서 이와 같은 것을 구현하는 최선의 방법은 무엇입니까?

나는 이와 비슷한 것을 구현했지만 잘못되었거나해야 할 방법이 아닙니다.

def calculate(self): 
    try: 
     market_supply_price = self.__price_to_pay_current_market_supply() 
    except: 
     pass 
     try: 
      time.sleep(600) 
      market_supply_price = self.__price_to_pay_current_market_supply() 
     except: 
      pass 
      try: 
       time.sleep(600) 
       market_supply_price = self.__price_to_pay_current_market_supply() 
      except: 
       pass 
       try: 
        time.sleep(1200) 
        market_supply_price = self.__price_to_pay_current_market_supply() 
       except: 
        sys.exit(1) 
    market_supply_price_usd = market_supply_price.get('usd') 
    market_supply_price_eur = market_supply_price.get('eur') 
    amount = '%.8f' % ((self.euro - ((self.euro*self.__tax_to_apply())+self.__extra_tax_to_apply()))/market_supply_price_eur) 
    return {'usd': [market_supply_price_usd, amount], 'eur': [market_supply_price_eur, amount]} 

올바르게 수행하는 방법에 대한 단서가 있습니까?

최고 감사 카드 :

+1

* 폴링 및 교차 손가락을 계속 사용할 경우 고려하십시오. 패턴이 2-3 번 이상 반복 될 때마다 적색 플래그가 올려 져야합니다. 코드를 간단하게 만들기 위해'market_supply_price'라는 코드를 자신의 함수에 넣으므로 성공시 즉시'return'을 사용할 수 있습니다. 그런 다음 그 설문이 어떻게 "다소"인지를 볼 수 있습니다 일반적인". 그러나 내 * 첫 번째 경향은 다음과 같습니다. 웹 서비스 *에 액세스 할 수 있는지 확인하거나 실패하면 (실패를 기록하고 나중에 전체 프로세스를 다시 시작). 그렇지 않으면 코드가 단지 더 큰 문제를 은폐하고 있습니다. – user2864740

+0

답장 user2864740 주셔서 감사합니다. 나는 당신의 견해를 봅니다. 나는 그것을 실패하게하고, 그것을 기록하고 나중에 다시 시작함으로써 문제를 처리하려고 노력할 것이다. 감사. –

+0

별도의 스레드 또는 프로세스를 사용하여 웹 서비스의 결과를 폴링하고 예를 들어 웹 서비스에 저장하는 것이 좋습니다. 데이터베이스. 여러 계층의 블록을 제외하고 중첩시키지 말고 스레드가 잠자기 시간 동안 변수를 사용하여 특정 레벨 (예 : 1 시간. – Stefan

답변

0

루프는 이러한 유형의 작업에 적합합니다. 다음은 시간 제한을 지정하는 예입니다.

def calculate(self): 
    for timeout in (600, 600, 1200): 
     try: 
      market_supply_price = self.__price_to_pay_current_market_supply() 
      break 
     except: # BAD! Catch specific exceptions 
      sleep(timeout) 
    else: 
     print "operation failed" 
     sys.exit(1) 

    market_supply_price_usd = market_supply_price.get('usd') 
    market_supply_price_eur = market_supply_price.get('eur') 
    etc...