2016-08-01 60 views
1

所以我有这个代码,我需要这两个线程一个接一个地运行。如何让这两个线程一个接一个地不断运行python?

所以,一旦线程1完成,线程2就会进入,一旦线程2完成,线程1就会进入线程2等......就像不断循环一样。

import httplib, urllib 
import time, sys 
import serial 
from threading import Thread 
#from multiprocessing import Process 

key = 'MY API KEY' #API Key required for ThingSpeak. 
rfWaterLevelVal = 0   #Global variable that holds the final water level value. 

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

#Gathers the rf data received and separated it to obtain the water level data. 
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) 

#Created purely to making the multithreading easier.   
def rfWaterLevelFinal(): 
    while True: 
     try: 
      rfWaterLevel() 
     except KeyboardInterrupt: 
      print "caught keyboard interrupt" 
      sys.exit() 

#Sends the sensor data over to ThingSpeak. 
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) 
    response = conn.getresponse() 
    print response.status, response.reason 
    data = response.read() 
    conn.close() 

#Created purely to make multithreading easier. 
def sendDataFinal(): 
    while True: 
     try: 
      sendDataFinal() 
     except KeyboardInterrupt: 
      print "caught keyboard interrupt" 
      sys.exit() 

#start thread 1 for rf water level data. 
t1 = Thread(target = rfWaterLevelFinal()) 
t1.start() 

#start thread 2 for sending the data. 
t2 = Thread(target = sendDataFinal()) 
t2.start() 

#wait for both threads to finish 
t1.join() 
t2.join() 

所以基本上我需要这个线程1开始接不完,线程2开始接不完,要不断地运行(好像它是一个无限循环)。

我已经看过在Python中使用一个线程池,但我不知道如何应用它。

关于我能做些什么来获得我想要的结果的想法?

干杯 在此先感谢!

+1

你不需要线程按顺序运行 – YOU

回答

1

这是你想要的,

while True: 
    t1 = Thread(target = rfWaterLevelFinal()) 
    t1.start() 
    t1.join() 
    t2 = Thread(target = sendDataFinal()) 
    t2.start() 
    t2.join() 

但是,没有必要像与线程运行,你可以调用的方法。

while True: 
    rfWaterLevelFinal() 
    sendDataFinal() 
+0

我那种需要运行它们作为一个线程作为第一个方法需要正确地运行(因为它接收RF数据,如果有在过程中的任何延迟,它冻结/延迟每一个其他数据) – Verglas

+0

无论如何,你已经提到你需要等到线程1完成后才能启动线程2.因此,上述2个选项将会像这样工作 –

相关问题