Странная прерывистая проблема публикации с использованием запросов Python - PullRequest
0 голосов
/ 10 октября 2018

Я использую Raspberry Pi 3 и Python 2.7 с запросами на публикацию данных на моем сервере лампы.Все прекрасно работает, за исключением периодических ошибок публикации, которые перехватываются запросами.exceptions.ConnectTimeout.Кстати, время ожидания = 0,5 с, что в 2,5 раза больше времени регистрации (0,2 с).Смотрите код ниже.

Когда возникает исключение запроса, я проверяю доступ в Интернет с помощью CheckConnection ().Кстати, это занимает всего 0,016 секунды на пи, так быстро по сравнению с другими методами.При значении False публикация не повторяется и данные регистрируются локально.

Однако я могу удаленно подключиться к Pi с помощью TeamViewer, пока это происходит! Я отправляю данные на наш сервер с другими установками, так что это не проблема отключения облачного сервера.

Через несколько минут проблема решается сама собой и публикует резюме, как будто ничего не случилось.

Любые предложения о том, как я могу изменить свой код, приветствуются либо для определения основной причины, либо для устранения проблемы.,Заранее благодарим.

******** КОД ************

def PostData (полезная нагрузка, retry_count = 3):

url = 'http://xxx.xxx.xxx.xxx/api/data/push/'
try:
    response = requests.post(url,params=payload,timeout=0.5)
    if response.status_code == 200:
        return response.text
    response.raise_for_status()

except (requests.exceptions.RequestException, requests.exceptions.ConnectTimeout) as e:
    print "Post Error..."
    x = CheckConnection()
    if x==False:
        return "Internet for Posting: " + str(x)
    if retry_count >0:
        Reason = "Post Settings Retry: " + str(retry_count) 
        print Reason
        #sleeptime = 0.05*2**(3-retry_count)
        #time.sleep(sleeptime)            
        return PostData(payload, retry_count-1)
    if retry_count==0:
        Reason = "Error! Post settings retry failed. Retry=0.  Internet: " + str(x) 
        return Reason
    return None

except Exception as e:
    x = CheckConnection()
    Reason= "Error! Posting Exception: " + str(e) + "Internet: " + str(x)
    print Reason
    return None

def CheckConnection (хост = "8.8.8.8", порт = 53, время ожидания = 0,5):

try:
    socket.setdefaulttimeout(timeout)
    socket.socket(socket.AF_INET,socket.SOCK_STREAM).connect((host,port))
    return True
except Exception:
    return False
...