2016-07-13 158 views
1

我需要在特定時間之後每隔一段時間執行一次函數。每隔一定時間執行一次函數,而不需要計算函數的執行時間

例如,如果開始時時間是00:00:00,時間間隔爲5秒,然後我需要這個函數的執行時間爲:

00:00:00 
00:00:05 
00:00:10 
00:00:15 
... 
23:59:55 

正如你可以看到我的觀點是該系統

的時鐘與存在的關係問題,很多這個問題像 How to execute a function asynchronously every 60 seconds in Python?What is the best way to repeatedly execute a function every x seconds in Python? .Futhermore計算器我看到schedule 0.3.2其他的解決辦法。

我的問題是,例如,此代碼:

import schedule 
import time 

def job(): 
    print("I'm working...") 
    print 'execute f time: ', time.ctime(time.time()) 
    print 'execute f time: ', time.time() 
schedule.every().minutes.do(job) 

while 1: 
    schedule.run_pending() 
    time.sleep(1) 

在這種情況下,當我運行我的代碼我的代碼的輸出是:

I'm working... 
execute f time: Wed Jul 13 04:32:00 2016 
execute f time: 1468398720.88 
I'm working... 
execute f time: Wed Jul 13 04:33:00 2016 
execute f time: 1468398780.94 
I'm working... 
execute f time: Wed Jul 13 04:34:01 2016 
execute f time: 1468398841.0 

正如你可以看到這個代碼每分鐘執行一次,但時間間隔從1分鐘變爲1分鐘,1秒,這個錯誤對我很重要,可能是功能打印時間的原因。我需要繼續在這種情況下執行的每分鐘不引起

我與定時器溶液具有相同的錯誤的功能打印的次數的累積和秒:

import threading 
import time 

def f(): 
    # call f() again in 10 seconds 
    threading.Timer(10, f).start() 
    # do something here ... 
    print 'execute f time: ', time.time() 
    time.sleep(5) 

# start calling f now and every 10 sec thereafter 
print 'init time: ', time.time() 
f() 

輸出的片段示出在某些時刻的合成誤差導致間隔大於5([0,5,10,16,21,26,....]),這對我來說是錯誤的,因爲對我而言,重要的是執行功能:

init time: 1468407868.6 
execute f time: 1468407868.6 
execute f time: 1468407878.6 
execute f time: 1468407888.6 
execute f time: 1468407898.6 
execute f time: 1468407908.61 # change the interval 
execute f time: 1468407918.61 
execute f time: 1468407928.61 

隨着模塊調度我有相同的問題em

請提前感謝 。

更新

好吧,我測試的crontab,不能滿足我。首先,我測試這個要我在Ubuntu的用戶配置的crontab文件,但後來我發現了一個庫來編寫指令,以他的crontab文件的配置,所以我使用的庫Crontab

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from crontab import CronTab 
task = CronTab(user='cyberguille') 
command='/home/cyberguille/date.py' 
cron_job=task.new(command) 
cron_job.setall('*/1, *, *, *, *') 
task.write() 
print task.render() 

正如你可以看到每一個分鐘執行代碼,但是我看到兩個問題,在不到一分鐘內執行並不容易(請參閱How to run scripts every 5 seconds using cron?),我不知道爲什麼當我每分鐘執行一分鐘就是一秒鐘,而且我們的計算總和錯誤太大但錯誤比上面的例子更適合

代碼中的日期。PY是這個

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

#import time 
from datetime import datetime 
tiempo = datetime.now() 
#tiempo = time.strftime("%H:%M:%S") 
archivo=open('/home/cyberguille/archivo_fecha.txt', 'a+') 

archivo.write(str(tiempo) + '\n') 

和輸出的一個片段是

2016-07-19 00:11:01.307779 
2016-07-19 00:12:01.365995 
2016-07-19 00:13:01.421373 
2016-07-19 00:14:01.477752 
2016-07-19 00:15:01.532234 
2016-07-19 00:16:01.588818 
2016-07-19 00:17:01.649581 
2016-07-19 00:18:01.705975 
2016-07-19 00:19:01.759986 
2016-07-19 00:20:01.816754 
2016-07-19 00:21:01.873748 
2016-07-19 00:22:01.927750 
2016-07-19 00:23:01.980666 
2016-07-19 00:24:02.036164 
2016-07-19 00:25:01.090912 
2016-07-19 00:26:01.148098 

真的每隔一分鐘,你能說這不是importan錯誤,但爲什麼不更多鈔票用秒00

執行例如
2016-07-19 00:11:00.307779 
2016-07-19 00:12:00.365995 
2016-07-19 00:13:00.421373 
2016-07-19 00:14:00.477752 

也許腳本的調用很慢。

我找到了良好的效果給我一個解決方案是腳本

from multiprocessing import Process 
    from datetime import datetime 
    import time 
    import sched 

    def timer(interval): 
      sc = sched.scheduler(time.time, time.sleep) 
      sc.enter(1, 1, do_something, (sc,interval)) 
      sc.run() 
    def do_something(sc,interval): 
      dateTime = datetime.now() 
      if(dateTime.second%interval==0): 
       p = Process(target=SensorContainer.run,args=(dateTime,)) 
       p.start() 
      sc.enter(1, 1, SensorContainer.do_something, (sc,interval,)) 


    def run(datetime): 
      print datetime 

用此溶液定時器工作0秒每隔一分鐘,你可以看到我的措施是,當我打電話的功能,這與crontab中的不一樣,但是在任何情況下,我都會測試運行函數內部的時間,並且秒數也是0。

回答

3

我相信你是最好依靠操作系統上做調度比Python的。使用簡單的腳本使用單一功能,然後使用crontab(如果使用Linux)或Windows任務計劃程序來計劃執行將會更簡單。

原因之一喜歡的操作系統的做法是穩健性。例如,如果您依賴Python進行調度,萬一發生了未處理的異常,那麼腳本將終止,直到它再次手動執行。這同樣適用於重新啓動系統等

如果您正在使用調度操作系統,該腳本將保持甚至在系統重新啓動和未處理的異常的情況下,在預定計劃執行。

+0

我使用Linux,也許我可以在Python執行shell命令要做到這一點,因爲這個代碼是在oython開發的系統的一部分。你可以擴展你的答案:爲什麼使用操作系統比使用Python更好? – Cyberguille

+0

@Cyber​​guille我已經編輯我的答案 – DeepSpace

+0

現在我讀的crontab,晚了,我測試你的意見,如果我的工作,只要我我可以投票了,並接受你的答案 – Cyberguille