簡體   English   中英

如何在不使用睡眠 function 的情況下每 N 次執行一次 X?

[英]How to do X every N time without using the sleep function?

我想制作一個簡單的 python 程序來為 flask 網站生成驗證碼。 我可以生成圖像,但如果我將其保存在例如/images/captcha_{id}.png中,那么隨着網站的使用,我將擁有大量的舊驗證碼。

我嘗試創建一個腳本,該腳本使用睡眠 function 每 N 次刪除舊的驗證碼,但問題是,我禁用了網站中的所有活動 N 次。

驗證碼系統如下:

import secrets, string
from PIL import Image, ImageFont, ImageDraw

def gen_captcha(id):
    alpha = string.ascii_letters + string.digits
    captcha = "".join(secrets.choice(alpha) for i in range(8))

    img = Image.new("RGBA", (200,100), (3, 115, 252))
    font = ImageFont.truetype("arial.ttf",20)
    w,h = font.getsize(captcha)
    draw = ImageDraw.Draw(img)
    draw.text((50,50), captcha, font=font, fill=(255, 239, 0))

    img.save("captcha_{}.png".format(str(id))

    return captcha

flask 應用程序基本上請求輸入並根據給定的 id 顯示驗證碼,然后說if req_captcha == captcha: return "You solved the captcha"如果你不解決它也會給出錯誤。

我想知道的是,我是否可以制作一個作為后台進程運行的小腳本,以刪除我的舊驗證碼。

我認為您正在尋找的是cron 工作 設置一個運行 bash 腳本來清理昨天的驗證碼。

一種可能的方法是使用 Python 中可用的multiprocessingthreading模塊。 它們在 API 方面非常相似。 我的答案將基於多處理方法,但您可以自己評估線程方法是否更適合您的需求。 你可以參考這個問題作為例子。 這是一個示例實現:

import os
import time
from multiprocessing import Process

def remove_old_captchas():
    if os.fork() != 0:
        return
    print('Running process to remove captchas every 5 seconds ...')
    while True:
        time.sleep(5)
        print("... Captcha removed")

if __name__ == '__main__':
    p = Process(target=remove_old_captchas)
    p.daemon = True
    p.start()
    p.join()
    print('Main code running as well ...')
    while True:
        time.sleep(1)
        print("... Request served")

在 output 中,您可以看到驗證碼以固定的時間間隔被刪除:

Running process to remove captchas every 5 seconds ...
Main code running as well ...
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served

在設計方面,我可能仍然會使用 go 和另一個答案中提到的 cron 作業,但是您詢問了運行后台任務,所以這是一個可能的答案。 您可能還喜歡subprocess模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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