類似於windows系統裡的計劃任務,需要按特定的時間週期,去調度執行一項任務。python裡有apscheduler組件。
分有阻塞式與非阻塞式,如下是阻塞式,就是不需要自己去寫循環。
from apscheduler.schedulers.background import BlockingScheduler
from datetime import datetime
def tick():
print('Tick! The time is: %s' % datetime.now())
if __name__ == '__main__':
scheduler = BlockingScheduler()
scheduler.add_job(tick, 'interval', seconds=3)
scheduler.start()
可以看到結果,第3秒會觸發一次調用。
Tick! The time is: 2017-11-29 10:43:07.244755
Tick! The time is: 2017-11-29 10:43:10.246927
Tick! The time is: 2017-11-29 10:43:13.235098
Tick! The time is: 2017-11-29 10:43:16.243270
Tick! The time is: 2017-11-29 10:43:19.239441
這個比較簡單,重點是cron形式,支持cron表達式,這種方式非常靈活。
Cron表達式是一個字符串,字符串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,Cron有如下兩種語法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
每一個域可出現的字符如下:
Seconds:可出現", - * /"四個字符,有效範圍為0-59的整數
Minutes:可出現", - * /"四個字符,有效範圍為0-59的整數
Hours:可出現", - * /"四個字符,有效範圍為0-23的整數
DayofMonth:可出現", - * / ? L W C"八個字符,有效範圍為0-31的整數
Month:可出現", - * /"四個字符,有效範圍為1-12的整數或JAN-DEc
DayofWeek:可出現", - * / ? L C #"四個字符,有效範圍為1-7的整數或SUN-SAT兩個範圍。1表示星期天,2表示星期一, 依次類推
Year:可出現", - * /"四個字符,有效範圍為1970-2099年
如下就是每小時運行一次:
scheduler = BlockingScheduler(executors=executors)
scheduler.add_job(article_job, 'cron', hour='0/1')
django在docker裡部署的問題及解決方案:
創建容器時用-p選項指定了容器開放的端口8000
在Docker容器裡用命令python manage.py runserver啟動了Django服務器
用docker ps命令得到了主機到該容器的IP映射0.0.0.0:8000
然後在主機通過瀏覽器訪問地址localhost:8000,結果不能訪問到容器裡的Django
解決方案:
命令python manage.py runserver默認監聽127.0.0.1:8000,但是地址127.0.0.1是一個迴環地址,表示“我自己”,不能通過外部訪問,只能自己訪問
所以需要指定監聽端口python manage.py runserver 0.0.0.0:8000,其中0.0.0.0表示監聽所有地址,然後用主機的瀏覽器訪問地址localhost:8000,該地址映射到容器的localhost:8000
好了,今天就分享到這裡,希望本文對大家有所幫助,如果大家覺得有用可以點個關注支持一下謝謝!
另外多說一句,我整理了一套python系統學習教程,從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。需要這些資料的只要關注我,在後臺私信回覆:“01”即可免費領取。