我需要在特定時間之後每隔一段時間執行一次函數。每隔一定時間執行一次函數,而不需要計算函數的執行時間
例如,如果開始時時間是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。
我使用Linux,也許我可以在Python執行shell命令要做到這一點,因爲這個代碼是在oython開發的系統的一部分。你可以擴展你的答案:爲什麼使用操作系統比使用Python更好? – Cyberguille
@Cyberguille我已經編輯我的答案 – DeepSpace
現在我讀的crontab,晚了,我測試你的意見,如果我的工作,只要我我可以投票了,並接受你的答案 – Cyberguille