Flask + uwsgi +线程

时间:2017-08-24 14:55:24

标签: python multithreading flask uwsgi

我有一个烧瓶应用程序,我想通过一个线程每分钟执行一次更新任务。

线程设置如下:

def print_thread():
    print "I am a thread"

@app.before_first_request
def start_thread():
    threading.Timer(60, print_thread).start()

烧瓶应用程序通过uwsgi运行:

uwsgi_python -s /tmp/uwsgi.sock --processes 1 --threads 4 -w app:app --enable-threads

之前我遇到过这个问题并通过flask每分钟通过cron调用一个flask端点来解决它,但是我想要一个自包含在{{1}}中的更清晰的解决方案应用程序。

有人可以发现问题吗?

或者知道一个解决这个问题的干净解决方案?

由于

1 个答案:

答案 0 :(得分:0)

我建议避免在与通过WSGI创建的flask实例相同的过程中运行后台任务。这样可以确保通过uwsgi创建的多个进程/线程不会使后台任务重复。

您可以从其他文件启动单独的python进程,并使用python计划,例如apscheduler

from apscheduler.schedulers.background import BlockingScheduler

from app import create_app # Your app factory
from app import job # A job function

# Most probably, your background job will depend on your app being initialized
# If you don't use the app factory pattern, you can simply import a file containing your app to trigger initialization. 
app = create_app() 

scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', minutes=1)

scheduler.start()

然后,您可以将此脚本放置在app.py旁边,并使用 python your_name.py,并使其与uwsgi一起运行。这样,您的Web应用程序和后台任务将共享代码和配置,但是过程将被清楚地分开。