我正在运行一个在uwsgi(2个进程)后面运行的Flask webapp。我的代码的一部分涉及ping远程资源,查看它是否已被修改(If-Modified-Since
),并在网络服务器上更新该资源的本地副本(如果已修改)。
该更新还向我发送了差异的电子邮件。我担心这需要很长时间,导致用户请求在发送电子邮件时超时。
Python线程库是解决这个问题的正确方法吗? (产生一个线程并在那里发送电子邮件?)这会干扰uwsgi的进程吗?
感谢您的帮助!
(旁注:如果他们都尝试更新本地副本上的资源,我也有点担心2个uwsgi进程碰撞头...我想知道线程模块的锁定功能是否正确看看这个问题呢?)
编辑:为了澄清,我主要担心的是电子邮件任务是代码执行的一部分。它需要很长时间并在return_template
调用之前运行,因此会阻止对用户的响应。考虑到Flask / uwsgi环境,Python线程库是否是解决此问题的正确方法?
答案 0 :(得分:6)
此类任务的最佳解决方案是使用uWSGI假脱机程序。如果你想以特定的间隔运行任务,你可以使用@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()
答案 1 :(得分:2)
如果您尝试创建一个独立于服务器的应用程序(例如,如果您考虑过稍后用Gunicorn替换uWSGI),我建议您使用Celery。
以下是第一步:http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html