2017-07-04 34 views
0

我的腳本由crontab運行,我希望一部分代碼每天執行4次。如何更輕鬆地檢查一天運行4次的代碼的某些部分

我的代碼段,其

from datetime import datetime, time 
now = datetime.now() 
now_time = now.time() 
if now_time == time(10,00) or now_time == time(16,00) or now_time == time(22,00) or now_time == time (4,00): 
    func() 

這種解決方案的減是,這部分代碼可以在10.01,10.02被執行,並且將被跳過這樣。

是否有更溫和更短的方式來寫下這部分代碼?

謝謝!

+0

你需要[corntab](https://en.wikipedia.org/wiki/Cron),我的朋友。 – luoluo

+0

@luoluo我已經使用crontab運行這個腳本。如果我將使用crontab for python的擴展,它會將腳本掛在內存中,直到crontab的時間到來? – paus

回答

1

你可以做的是修改你的腳本來接受一個(額外的)參數,它將觸發代碼的特定部分的執行。然後,您可以修改crontab清單,以便在需要的時候使用該額外參數調用該腳本。因此,如果你想在整個半小時內運行腳本,並在4,10,16和22點做額外的工作,你可以在你的crontab文件中放入以下三行:

30 * * * * <script> # Thirty minutes after each hour 
0 1-3,5-9,11-15,17-21,23 * * * <script> # Every whole hour, except the four designated hours 
0 4,10,16,22 * * * <script with extra argument> # Script with extra argument at designated hours. 

通過這種方式,腳本每30分鐘運行一次,但在指定的時間腳本將使用額外的參數運行。

+0

你能給我一個例子,因爲我不知道crontab中的條件。如果我將兩個版本的代碼並行運行,它們將阻止彼此訪問sqlite3數據庫。 – paus

+0

沒有條件。您需要具有額外參數的條目才能執行特定代碼。在腳本運行的其他時間沒有額外參數的條目。這將有多複雜取決於腳本總共運行的頻率。但它具有的優點是您可以將時序方面置於功能的邏輯之外。至少這使得測試腳本能夠做到它應該做的事更容易。 –

+0

它每30分鐘運行一次:*/30 * * * *〜/ env/bin/python2〜/ hasoffers_api/script.py>〜/ hasoffers_api/logs/script_'date + \%Y \%m \%d \%^h \%M \%S'。日誌2>&1 – paus

0

我看到兩種方法來解決這個問題。

1)使用全局變量作爲計數器

numOfCalls = 0 
#for every func() call 
func() 
numOfCalls = numOfCalls + 1 

2)每次執行函數時,時間戳和FUNC名可能會寫入一些日誌文件

from datetime import datetime, time 
current_time = datetime.now().time() 

with open("log.txt", "a") as myfile: 
    myfile.write("func " + str(current_time) + "\n") 
1

如果你有移動到APScheduler(http://apscheduler.readthedocs.io/en/latest/userguide.html)的靈活性變得更容易,代碼更可靠。

from apscheduler.schedulers.background import BackgroundScheduler 

# assuming tick is your function 
scheduler = BackgroundScheduler() 
#cron which runs once in 6 hours 
scheduler.add_job(tick, 'cron', hour='*/6') 
scheduler.start() 
0

你在追求的是時間間隔。從同一個包datetime您可以創建timedelta對象(兩個日期時間之差),並將其轉換爲秒

您的代碼就變成了:

from datetime import datetime, time 
now = datetime.now() 
today = now.date() 
minutes_accepted = 5 
execution_times = [time(hour=10), time(hour=16), time(hour=22)] 
for delta in [datetime.combine(today, et) - now for et in execution_times]: 
    if abs(delta.total_seconds()) < minutes_accepted * 60: 
     print 'func' 
相關問題