在Flask Python中产生一个单独的执行线程(即向dev发送日志电子邮件)?

时间:2011-09-15 21:56:22

标签: python multithreading flask uwsgi

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

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

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

感谢您的帮助!

(旁注:如果他们都尝试更新本地副本上的资源,我也有点担心2个uwsgi进程碰撞头...我想知道线程模块的锁定功能是否正确看看这个问题呢?)

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

2 个答案:

答案 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