5

我正在运行一个在 uwsgi(2 个进程)后面运行的 Flask webapp。我的代码的一部分涉及 ping 远程资源,查看它是否已被修改 ( If-Modified-Since),如果已修改,则在网络服务器上更新该资源的本地副本。

该更新还向我自己发送了差异的电子邮件。我担心这需要很长时间,导致用户请求在发送电子邮件时超时。

Python 线程库是解决这个问题的正确方法吗?(产生一个线程并在那里发送电子邮件?)这会干扰 uwsgi 的进程吗?

谢谢您的帮助!

(附带说明:如果两个 uwsgi 进程都尝试更新本地副本上的资源,我也有点担心它们会碰头……我想知道线程模块的锁定功能是否正确也有这个问题?)

编辑:澄清一下,我主要关心的是电子邮件任务是代码执行的一部分。它需要很长时间并且在return_template调用之前运行,因此会阻止对用户的响应。考虑到 Flask/uwsgi 环境,Python 线程库是解决这个问题的正确方法吗?

4

2 回答 2

6

此类任务的最佳解决方案是使用 uWSGI spooler。如果你想在特定的时间间隔运行任务,你可以使用 @timer 装饰器并让后台处理程序来努力工作:

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()
于 2011-09-16T04:06:03.967 回答
2

如果您尝试制作一个独立于服务器的应用程序(例如,如果您打算稍后用 Gunicorn 替换 uWSGI),我建议您使用Celery

这是第一步:http ://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

于 2011-09-16T06:45:04.740 回答