所以我正在构建一个长期运行的查询Web应用程序供内部使用.
我的目标是让一个带有守护进程的烧瓶应用程序在服务器启动时启动,这将更新全局字典对象.
我没有必要发布任何示例代码,因为我已经尝试了很多方法并且没有一个成功.
守护进程将创建一个线程池(multiprocessing.Pool)来遍历所有数据库实例并对它们运行几个查询.
似乎无论我如何尝试和实现它(现在,使用烧瓶开发服务器)它都会锁定应用程序,并且在运行时无法执行任何其他操作.我试过阅读一堆文档,但是按照惯例,我会假设很多其他知识,最后我不知所措.
我想知道是否有人可以提供一些指导,即使它是我可以寻找的地方,因为我已经搜索了所有’烧瓶启动例程’和类似的,但没有找到任何用处.似乎当我将它部署到我们的服务器时,我可能能够在我的.wsgi文件中定义一些启动守护进程,但在那之前有没有办法在本地执行此操作?当我把它推出一般用途时,这是否是正确的方法?
否则,我只是想设置一个连续运行python脚本的cron作业,该脚本执行我需要的查询,并转储到MongoDB实例或其他东西,以便客户端可以简单地从中拉出(就像执行所有查询一样)在Flask应用程序的服务器端只是锁定服务器,所以没有其他任何事情可以用它来做 – 又名:不能对信息采取行动,杀死spids等)
对此的任何帮助都会有所帮助,我的大脑已经旋转了好几天.
from flask import Flask
from celery import Celery
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'amqp://guest@localhost//'
app.config['CELERY_RESULT_BACKEND'] = 'amqp://guest@localhost//'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
output = 0
@app.before_first_request
def init():
task = my_task.apply_async()
@app.route('/')
def hello_world():
global output
return 'Hello World! - ' + str(output)
@celery.task
def my_task():
global output
result = 0
for i in range(100):
result += i
output = result
if __name__ == '__main__':
app.run()
最佳答案 根据查询的复杂程度,您可以考虑通过第二个线程运行查询.由于
GIL,您不必担心常见的数据结构对象(例如字典)是线程安全的.关于线程的一个好处是即使有一个GIL,他们通常也不会阻止在强烈的I / O期间执行的其他线程(例如查询的线程).见
2.琐碎的例子:
import threading
import time
import random
from flask import Flask
app = Flask(__name__)
data_store = {'a': 1}
def interval_query():
while True:
time.sleep(1)
vals = {'a': random.randint(0,100)}
data_store.update(vals)
thread = threading.Thread(name='interval_query', target=interval_query)
thread.setDaemon(True)
thread.start()
@app.route('/')
def hello_world():
return str(data_store['a'])
if __name__ == "__main__":
app.run()