Jac*_*cob 5 python flask python-multiprocessing
因此,我正在构建一个长期运行的查询Web应用程序以供内部使用。
我的目标是拥有一个带有守护进程的flask应用程序,该守护进程在服务器启动时启动,它将更新全局字典对象。
我不一定要发布任何示例代码,因为我尝试了许多方法,但都没有成功。
守护程序将创建一个线程池(multiprocessing.Pool)以遍历所有数据库实例,并对它们运行几个查询。
看来,无论我如何尝试实施(现在,使用flask开发服务器),它都将锁定应用程序,并且在运行时无法执行任何其他操作。我曾尝试阅读大量文档,但通常还是会假设很多其他知识,但最终我不知所措。
我想知道是否有人可以提供一些指导,即使是在我可以找到的地方,因为我到处搜索了“烧瓶启动例程”和类似的东西,但没有发现任何用处。看来,当我将其部署到服务器上时,也许可以在.wsgi文件中定义一些启动守护程序,但是在那之前还有什么方法可以在本地执行此操作?当我将其推出以用于一般用途时,这甚至是正确的方法吗?
否则,我只是在考虑建立一个cron作业,该作业连续运行一个python脚本来执行我需要的查询,然后转储到MongoDB实例或其他东西,以便客户端可以从中进行提取(就像执行所有查询一样)在Flask应用程序的服务器端只是锁定了服务器,因此无法执行其他操作-aka:无法对信息采取行动,杀死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()
Run Code Online (Sandbox Code Playgroud)
小智 5
根据查询的复杂程度,您可以考虑通过第二个线程运行查询。由于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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5325 次 |
| 最近记录: |