簡體   English   中英

如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM