![](/img/trans.png)
[英]How to schedule a periodic task that is immune to system time change using Python
[英]How to schedule a periodic task in Python?
python - 如何在不阻塞的情況下在python中安排定期任務?
這是一個簡單的情況。 假設這個工單變量在 2 小時后失效。 所以我需要從服務中獲取它。
ticket = 1 # It expires every 2 hours
def process_using_ticket(): # This function is called using a get request from flask server
print('hello', ticket)
如何在不阻塞的情況下每兩小時重置為 1?
一種方法可能是啟動一個線程並睡眠 2 小時,然后重置變量,但我想知道是否有更好的選擇。
注意:一切都在 docker 中運行。
這看起來像是cron
一個用例,這是一個在所有 Linux 機器上都可以找到的簡單實用程序,用於安排定期任務。 可以創建一個簡單的cron任務,例如:
$ crontab -e
在 cron 中,輸入
0 */2 * * * /home/username/ticket_script.py
確保您的腳本具有可執行權限。 如果您在腳本中打印某些內容,請使 cron 條目重定向其輸出,例如
0 */2 * * * /home/username/ticket_script.py >> /home/username/ticket_script_runs.log
對於在 Docker 中運行它的問題,你可以通過這個線程 ->https://forums.docker.com/t/cronjobs-in-docker-container/2618/5它說:
大多數 Docker 容器僅運行您指定的二進制文件(在本例中為 /bin/bash),因此沒有運行 cron 守護程序來觸發這些作業。
有多種方法可以解決這個問題 - 對於小的臨時事物,您可以將 cron 條目添加到主機的 crontab 中,並使用 docker exec containername 觸發容器中的作業...
您可以使用啟動 cron 的 shell 腳本替換容器入口點,或者如果您需要多個服務,請使用諸如 supervisord 之類的東西來管理它們。
如果您全力以赴,您可以制作一個 cron 容器,然后您可以使用它來使用 docker exec 啟動任務。
另一種方法是你已經擁有的 - 睡眠 2 小時,或保持time_last_read
時間戳,繼續評估自上次讀取以來是否已經 2 小時( time_now - time_last_read >= 2_HOURS
),然后將值重新讀入內存一旦條件為 True 並重置time_last_read
。
將其放入帶有time.sleep(7200000)
的函數中。 像這樣:
import time
ticket = 1
def main_loop():
while True:
time.sleep(7200000)
ticket = 1
def process_using_ticket():
print('hello', ticket)
main_loop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.