如何在使用Python做其他事情时每隔n秒做一些事情

时间:2017-07-10 07:51:37

标签: python matplotlib raspberry-pi

我在覆盆子pi上做这件事。我是python的新手,我最近从arduino转到了Rasberry,用于这个项目。

我想每隔5秒向db发送一次temp,但我想每1分钟更新一次图表。但是,图表不会更新它卡在writeLog中。我写了print" loop"在s.run之后但它没有表现出来。接下来我写了print" here"在writeLog中的s.enter()之后显示。

此外,我无法将plotNow置于sched中(错误不在主循环中)。我尝试过线程但是我无法获得60秒的循环。

这是我目前的代码:

from matplotlib import pyplot as plt
from datetime import datetime

import MySQLdb
import sched, time

s = sched.scheduler(time.time, time.sleep)

db = MySQLdb.connect(host="localhost", user="root", passwd="", db="log")
cur = db.cursor()

cnt = 0    

tempC = []

plt.ion()
plt.figure(figsize=(10,5))


def writeLog(sc):
    print "Insert to DB"
    try:
        st = "%.2f" % thermoTempC        
        cur.execute("""INSERT INTO history (Datetime, Temp_Degrees, Remarks) VALUES (%s, %s, %s)""", (datetime.now().strftime('%Y-%m-%d %H:%M:%S'), st, 'OK'))
        db.commit()
    except:
        db.rollback()
    s.enter(5,1,writeLog,(sc,))    


def plotNow():
    plt.clf()
    plt.grid(True)        
    plt.title('Current Temp = {:.2f}$^\circ$C'.format(thermoTempC), fontsize=15)   
    plt.ylabel('Temperature(C)')
    plt.xlabel('Time(min)')
    plt.xlim(0,120)
    plt.ylim(0,90)    
    plt.plot(tempC, 'r.-', label='Actual', color='red')
    plt.legend(loc='upper right')   
    plt.show(block=False)


while True:            
    thermoTempC = "32.00"

    tempC.append(thermoTempC)    
    plotNow()
    plt.pause(.1)
    cnt = cnt+1

    if(cnt>120):
        tempC.pop(0)    

    s.enter(5,1,writeLog,(s,))
    s.run()

1 个答案:

答案 0 :(得分:0)

我找不到我想要的重复问题,所以这是我的答案。

您可以使用threading模块将每个进程放在一个线程中。

假设您有Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::group(['middleware' => 'auth'], function () { Route::group(['prefix' => 'admin'], function () { Route::get('/', 'HomeController@index')->name('dashboard'); Route::get('/home', 'HomeController@index')->name('home'); Route::get('/users', 'UserController@index')->name('users'); }); }); HomeController@index个函数,它们分别执行一次发送温度的基本操作,并更新图形一次。

您需要定义两个将连续运行的函数:

Step 2: 
        Extract Images and store total_count in Dynamodb
Step 3: 
       At the end of Lambda increment new column current_count
       if(current_count==total_count){ trigger Step 4 }

然后,为两个操作创建一个线程,并运行两个线程。

send_temp_db

不要忘记join你的一个主题。 如果不这样做,程序将在两个线程启动后立即退出。