使用python请求的奇怪的间歇性发布问题

时间:2018-10-10 16:59:03

标签: python sockets python-requests raspberry-pi3 teamviewer

我正在使用树莓派3和python 2.7,并要求将数据发布到我的灯服务器。除了间歇性的张贴错误(捕获的request.exceptions.ConnectTimeout)外,其他所有方法都很好用。顺便说一句,超时= 0.5秒,是发布时间(0.2秒)的2.5倍。请参见下面的代码。

发生请求异常时,我使用CheckConnection()检查互联网访问。顺便说一句,这在pi上仅需0.016秒;与其他技术相比如此之快。为False时,它不会重试发布并在本地记录数据。

但是,在发生这种情况时,我可以使用TeamViewer远程连接到Pi!我将数据与其他安装一起发布到我们的服务器,因此这不是云服务器停机的问题。

几分钟到几分钟后,问题解决了,并且像没有错一样发布了简历。

无论是确定根本原因还是解决问题,都欢迎任何有关如何更改代码的建议。预先谢谢你。

********代码************

def PostData(有效载荷,重试次数= 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(host =“ 8.8.8.8”,port = 53,timeout = 0.5):

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

0 个答案:

没有答案