gpt4 book ai didi

flask - 您可以并行运行多个 Flask SQLAlchemy 查询吗?

转载 作者:行者123 更新时间:2023-12-04 11:56:00 24 4
gpt4 key购买 nike

在我当前的设置中,如果我执行五个 100 毫秒的查询,它们总共需要 500 毫秒。有没有办法可以并行运行它们,只需要 100 毫秒?

我在 nginx/uwsgi 后面运行 Flask,但可以更改其中任何一个。

具体来说,我希望能够从这里转换代码:

result_1 = db.session.query(...).all()
result_2 = db.session.query(...).all()
result_3 = db.session.query(...).all()

对于这样的事情:
result_1, result_2, result_3 = run_in_parallel([
db.session.query(...).all(),
db.session.query(...).all(),
db.session.query(...).all(),
])

有没有办法用 Flask 和 SQLAlchemy 做到这一点?

最佳答案

一般的并行性

一般来说,如果你想并行运行任务,你可以使用线程或进程。在 python 中,线程非常适合 I/O 绑定(bind)的任务(意味着它们花费的时间花在等待另一个资源上——等待你的数据库、磁盘或远程网络服务器),而进程非常适合任务受 CPU 限制的(数学和其他计算密集型任务)。

并发 future

在您的情况下,线程是理想的。 Python 有一个 threading模块,您可以查看,但有一些需要解压缩:安全使用线程通常意味着通过使用线程池和任务队列来限制可以运行的线程数。出于这个原因,我更喜欢 concurrent.futures库,它提供了 threading 周围的包装器为您提供易于使用的界面并为您处理许多复杂问题。

使用时 concurrent.futures ,您创建一个执行程序,然后将任务与参数列表一起提交给它。而不是像这样调用函数:

# get 4 to the power of 5
result = pow(4, 5)
print(result)

您提交函数及其参数:

您通常会像这样使用 concurrent.futures:
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor()
future = executor.submit(pow, 4, 5)
print(future.result())

请注意我们如何不使用 pow() 调用该函数,我们提交函数对象 pow执行程序将在线程内调用。

为了更容易使用 concurrent.futures带 Flask 的库,你可以使用 flask-executor它像任何其他 Flask 扩展一样工作。它还处理后台任务需要访问后台任务中 Flask 的上下文局部变量(如 appsessiongrequest 对象)的边缘情况。完全披露:我编写并维护了这个库。

(有趣的事实: concurrent.futures 使用相同的 API 包装了线程和多处理 - 因此,如果您发现自己将来需要对 CPU 密集型任务进行多处理,您可以以相同的方式使用相同的库来实现您的目标)

把这一切放在一起

这是使用 flask-executor 的内容并行运行 SQLAlchemy 任务如下所示:
from flask_executor import Executor
# ... define your `app` and `db` objects

executor = Executor(app)

# run the same query three times in parallel and collect all the results
futures = []
for i in range(3):
# note the lack of () after ".all", as we're passing the function object, not calling it ourselves
future = executor.submit(db.session.query(MyModel).all)
futures.append(future)

for future in futures:
print(future.result())

Boom,您现在已经并行运行了多个 Flask SQLAlchemy 查询。

关于flask - 您可以并行运行多个 Flask SQLAlchemy 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55505978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com