在Flask Python中生成独立线程(即发送日志邮件给开发者)?

5 投票
2 回答
2991 浏览
提问于 2025-04-17 02:24

我正在运行一个Flask的网页应用,它是通过uwsgi来处理的(有两个进程)。我的代码中有一部分是用来检查一个远程资源,看它是否被修改过(用的是If-Modified-Since),如果有修改,就会在服务器上更新这个资源的本地副本。

在更新的同时,我还会给自己发一封邮件,告诉我具体的变化。我有点担心,这个过程可能会花费很长时间,导致用户的请求超时,因为发送邮件的时间太长了。

请问,使用Python的线程库来解决这个问题合适吗?(开一个线程在里面发送邮件?)这样会不会对uwsgi的进程造成影响呢?

谢谢你的帮助!

(顺便提一下:我也有点担心这两个uwsgi进程会互相干扰,如果它们都试图更新本地副本的资源……我在想,线程模块的锁功能是否能解决这个问题?)

编辑:为了更清楚,我主要担心的是发送邮件的任务是代码执行的一部分。这个过程耗时较长,并且在return_template调用之前运行,因此会拖延用户的响应。在Flask/uwsgi环境下,使用Python的线程库来解决这个问题合适吗?

2 个回答

2

如果你想做一个不依赖于服务器的应用(比如说,你打算以后用Gunicorn替换掉uWSGI),我建议你使用Celery

这里是一些入门步骤:http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

6

对于这类任务,最好的解决办法是使用uWSGI的spooler功能。如果你想在特定的时间间隔内运行这些任务,可以使用@timer这个装饰器,让spooler来处理繁重的工作:

from uwsgidecorators import *

#this will execute the_task() every 30 seconds in the spooler
@timer(30, target='spooler')
def the_task(signum)
    do_the_long_task()

撰写回答