【发布时间】:2016-04-13 09:25:56
【问题描述】:
我正在使用 Flask + Apache + mod_wsgi 构建一个网络服务器。我需要在我的网络服务器中启动一个后台线程,以便定期做一些事情。一切都很好,应用程序已启动并且线程可以正常工作,但我无法加入它。下面是一些代码sn-ps:
.wsgi 文件
import sys, atexit, logging
logging.basicConfig(filename='app.log', level=logging.INFO, filemode='w')
logging.info('App started')
sys.path.insert(0, '/my/src/dir/with/main.py/')
from main import app, users_manager
@atexit.register
def on_exit_callback():
logging.info('App will now be shutdowned')
users_manager.set_shutting_down()
users_manager.join_thread()
application = app
main.py
from flask import Flask
import logging
from threading import Thread
app = Flask(__name__)
@app.route("/", methods=['GET'])
def home():
return "OK"
class UsersManager():
def __init__(self):
self.users = {}
self.shutdown_thread = False
self.my_worker_thread = Thread(target=self.worker_function)
self.my_worker_thread.start()
def worker_function(self):
while self.shutdown_thread is not True:
# doing my stuff
def set_shutting_down(self):
self.shutdown_thread = True
def join_thread(self):
logging.info('joining thread')
if self.my_worker_thread.is_alive():
logging.info('thread is alive')
self.my_worker_thread.join()
users_manager = UsersManager()
if __name__ == "__main__":
app.run()
所以,在 app.log 中,我只看到“应用已启动”。
也许,除了使用atexit 模块之外,还有其他方法可以在 apache 和 wsgi 关闭时加入我的线程。
【问题讨论】:
标签: python multithreading apache flask mod-wsgi