2016-07-22 23 views
0

文字列の配列であるこのグローバル変数の更新に問題があります。このrfDataArrayは、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() 

を初期配列で立ち往生し、二度と更新されません(そうrfWaterlevelValは、クラウドサーバーに送っように更新されます)。

答えて

0

競合状態になっています。配列は、クラウドがそれを返す前に値を格納しようとしています。非同期で操作を行う必要があります。 1つの解決策は、Pythonマルチスレッドのコールバックメソッドを使用することです。代わりに、いくつかの 'ロック'メカニズムを使用し、クラウドからの応答を得るまで、プログラムの残りの部分を実行することはできません。

+0

これらの潜在的な解決策の両方を適用する方法を教えてください。 – Verglas

+0

非同期呼び出しのための[ここでは単純なスタックオーバーフローソリューションです](http://stackoverflow.com/questions/1239035/asynchronous-method-call-in-python)。 [Here]は、同期呼び出し(https://docs.python.org/3/library/asyncio-sync.html)のためのpythonのドキュメントです。 – rt88

関連する問題