保持一种方法不断运行,并且每隔一段时间执行另一种方法

时间:2016-07-29 02:27:03

标签: python multithreading multiprocessing raspberry-pi2

所以目前我是这两种方法,其中一个人不断地从另一个设备读取RF数据,而另一个方法经常发送这些数据。

我怎么能这样做?我需要不断更新和接收RF数据传入,而sendData()方法只需从全局变量中获取数据即可。

到目前为止,下面是代码,但它不起作用......

import httplib, urllib
import time, sys
import serial
from multiprocessing import Process

key = 'MY API KEY'
rfWaterLevelVal = 0

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

def rfWaterLevel():
    global rfWaterLevelVal

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

def sendData():
    global rfWaterLevelVal

    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()
        p = Process(target=sendData(), args())
        p.start()
        p.join()

        #Also tried threading...did not work..
        #t1 = threading.Thread(target=rfWaterLevel())
        #t2 = threading.Thread(target=sendData())
        #t1.start()
        #t1.join()
        #t2.join()
    except KeyboardInterrupt:
        print "caught keyboard interrupt"
        sys.exit()

请帮忙!

只是为了澄清,我需要rfWaterLevel()方法不断运行,因为rf数据不断传入,我需要sendData()只要它准备再次发送就会被调用(大约每5秒左右) 。但似乎,如果传入的射频数据存在任何延迟,则rf数据会自行更新(接收端),因此发送的数据与射频发射器发送的数据不准确。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不能给你一个完整的解决方案,但我可以引导你走向正确的方向。

您的代码有三个问题。

  1. Process启动(顾名思义)一个新进程,而不是一个新线程。 新进程无法与旧进程共享数据。 你应该使用mutlithreading。 按照here

  2. 的说明查看threading
  3. 您正在主线程中调用rfWaterLevel()。 您需要在进入while循环之前启动第二个线程。

  4. 您正在while循环中一次又一次地创建第二个线程。 只创建一次并将while循环放在函数

  5. 您的基本程序结构应如下所示:

    import time
    
    def thread_function_1():
        while True:
            rfWaterLevel()
    
    def thread_function_2():
        while True:
            sendData()
            time.sleep(5)
    
    # start thread 1
    thread1 = Thread(target = thread_function_1)
    thread1.start()
    
    # start thread 2
    thread2 = Thread(target = thread_function_2)
    thread2.start()
    
    # wait for both threads to finish
    thread1.join()
    thread2.join()