将数据发送到云服务器后变量不更新

时间:2016-07-22 00:45:00

标签: python python-2.7 http global-variables cloud

我在更新这个字符串数组的全局变量时遇到了麻烦。当rf数据从另一个设备进入时,应该更新此rfDataArray。现在,当我测试了没有向云服务器发送任何内容时,它可以工作(rfDataArray会像发送数据一样频繁更新)但是一旦我开始发送数据,rfDataArray数组似乎停留在初始数组,并且不会再次更新......

import httplib, urllib
import time, sys
import serial

key = 'MY_API_KEY'
rfDataArray = []
rfWaterLevelVal = 0

ser = serial.Serial('/dev/ttyUSB0',9600)

def rfWaterLevel():
    global rfWaterLevelVal
    global rfDataArray

    rfDataArray = ser.readline().strip().split()
    print 'incoming: %s' %rfDataArray
    if len(rfDataArray) == 5:
        rfWaterLevelVal = float(rfDataArray[4])
        print 'RFWater Level1: %.3f cm' % (rfWaterLevelVal)


def sendRFWaterlevel():
    params = urllib.urlencode({'field1':rfWaterLevelVal, 'key':key})
    headers = {"Content-type": "application/x-www-form-urlencoded",
               "Accept": "text/plain"}
    conn = httplib.HTTPConnection("api.thingspeak.com:80", timeout = 5)
    conn.request("POST", "/update", params, headers)
    print 'RFWater Level2: %.3f cm' % (rfWaterLevelVal)
    response = conn.getresponse()
    print response.status, response.reason
    data = response.read()
    conn.close()

while True:
    try:
        rfWaterLevel()
        time.sleep(1)
        sendRFWaterlevel()
        time.sleep(3)
    except KeyboardInterrupt:
        print "caught keyboard interrupt"
        sys.exit()

我需要更新rfDataArray变量(以便更新rfWaterlevelVal以发送到云服务器)。

1 个答案:

答案 0 :(得分:0)

你正在遇到竞争状态。该阵列试图在云可以将其发回之前存储值。您需要异步执行操作。一种解决方案是使用Python多线程的回调方法。或者,你可以使用一些“锁定”机制,而不是执行程序的其余部分,直到你从云端得到响应。