2016-07-13 15 views
1

実行する必要があるのは、一定の時間間隔ごとに関数を実行する必要があるからです。例えば関数の実行時間を数えずに一定時間ごとに関数を実行する

初めの時間は夜12時00分00秒で、間隔は5秒であるならば、私は、この関数の実行時間があることが必要です。

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

あなたは私のポイントは見ることができるように私はschedule 0.3.2で他のソリューションを参照してください.Futhermoreシステム

のクロックは 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?などのstackoverflowの関係この質問をして、多くの質問が存在しています。私は自分のコードを実行したときに

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 

私は同じproblを持っているem

お気軽に お返事ありがとうございます。

更新

[OK]を私は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() 

を使用します分実行コードですが、1分以内で実行するのは簡単ではありません(How to run scripts every 5 seconds using cron?を参照)。なぜなら、1分ごとに1分ごとに1秒間実行するとわかりません。エラーは上記の例よりもよく適合します

日付のコードです。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エラーではないと言うことができるすべての1分ですが、かのうない理由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 

多分、スクリプトの呼び出しが遅いです。

私は私に良い結果と解決策を見つけたあなたは、私は関数を呼び出すとき、私の尺度である見ることができるように、これは、0秒で一人一人分、このソリューションでスクリプト

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 

タイマーの仕事です、それはcrontabと同じではありませんが、いずれにしても、実行関数の内部で時間をとってテストするのは0秒です。

答えて

3

私はあなたがPythonよりもスケジューリングを行うためにOSに頼っているほうが良いと信じています。単一の関数で単純なスクリプトを作成し、crontab(Linuxを使用している場合)またはWindowsのタスクスケジューラを使用して実行をスケジュールするのは簡単です。

OSアプローチを好む理由の1つは、堅牢性です。たとえば、スケジューリングにPythonを使用している場合、未処理の例外が発生した場合、スクリプトは手動で再度実行されるまで終了します。システムリブートなどでも同じです。

OSをスケジューリングに使用している場合、スクリプトはシステムの再起動や処理されない例外の場合でも、あらかじめ定義されたスケジュールで実行され続けます。

+0

linuxを使用していますが、これはPythonでシェルコマンドを実行することができます。このコードはoythonで開発されたシステムの一部であるためです。あなたは、なぜPython上よりもOSでうまくいくのが良いかについてのあなたの答えを広げることができますか? – Cyberguille

+0

@Cyber​​guille私は自分の答えを編集しました – DeepSpace

+0

私はあなたのアドバイスをテストし、すぐに私のために働くことができたら、私は投票してあなたの答えを受け入れることができます – Cyberguille

関連する問題