2014-01-30 2 views
0

Я кодирую некоторый Python, который будет обрабатывать вызов веб-сервиса.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]} 

Вызов к WebService на этой линии:

market_supply_price = self.__price_to_pay_current_market_supply() 

Этот частный метод делает различные вызовы к WebService и отдай мне результат. Моя проблема заключается в том, что этот веб-сервис сильно терпит неудачу. Мне нужно реализовать способ, который, если один из вызовов завершится неудачно, я буду ждать, например, 10 минут и повторю попытку, если через 10 минут снова сработает, я подожду 30 минут и повторю попытку, если через 30 минут снова не удастся, я подождите 60 минут ...

Каков наилучший способ реализовать что-то подобное в методе расчета()?

Я реализовал что-то подобное, но это выглядит неправильно, а не то, как это должно быть сделано.

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

Loops работают хорошо для такого рода вещи. Вот пример, где вы указываете таймауты:

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...