如何每隔N次执行X而不使用睡眠功能?

问题描述 投票:2回答:2

我想制作一个简单的python程序来为flask网站生成验证码。我可以生成图像,但是如果我将其保存为例如在/images/captcha_{id}.png中,随着网站的使用,我将拥有大量的旧验证码。

我已经尝试创建一个脚本,该脚本每隔N次使用sleep函数删除旧的验证码,但是问题是,我禁用了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

烧瓶应用程序基本上会请求输入并根据给定的ID显示验证码,然后说if req_captcha == captcha: return "You solved the captcha",如果您不解决,也会给出错误。

[我想知道的是,我是否可以编写一个作为后台进程运行的小脚本,以删除我的旧验证码。

python captcha
2个回答
0
投票

我认为您正在寻找的是cron job。设置一个运行bash脚本,以清理昨天的验证码。


0
投票

[一种可能的方法是使用Python中可用的multiprocessingthreading模块。它们在API方面都非常相似。我的回答将基于多处理方法,但是您可以自己评估线程方法是否更适合您的需求。您可以以question为例。这是一个示例实现:

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")

在输出中,您可以看到验证码在固定的时间间隔内被删除:

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

就设计而言,我可能仍会像另一个答案中提到的那样执行Cron工作,但是您询问是否要运行后台任务,因此这可能是一个答案。您可能还喜欢subprocess模块。

© www.soinside.com 2019 - 2024. All rights reserved.