如何在 Python3.7 docker 容器中执行并行 PostgreSQL 查询?

Posted

技术标签:

【中文标题】如何在 Python3.7 docker 容器中执行并行 PostgreSQL 查询?【英文标题】:How to do parallel PostgreSQL query exections in Python3.7 docker container? 【发布时间】:2019-10-10 06:57:38 【问题描述】:

我正在使用 Python3.7 将数据从 Postgres DB 移动到 AWS Redshift。我创建了一个 SQL 查询,该查询在执行时检索查询集(我使用 where 子句进行查询。因此,对于每个查询执行,我将更改我传递的 ID)。

我将在 Flask docker 容器 中运行此脚本,最终将在 Kubernetes 上运行。 我在 dockerized Flask app 中公开了一个 POST 方法端点,我将在其上接收需要在 DB 上查询的 ID 列表以及要移动到 Redshift 的数据Python

我想做多线程来一次执行多个查询并移动数据,因为我收到的 POST 请求中可能有很多 ID。

但是,当我使用 Python3.7 时,我开始知道 GIL 将成为一个瓶颈,线程数无关紧要你正在运行,任何时候都只会有一个线程在执行。

我如何克服这个问题,让在 DB 上并行执行 SQL 查询成为可能,并最终在 Kubernetes 上运行。

我可以使用 multiprocessing 还是有其他更好的方法来实现这一点?

【问题讨论】:

【参考方案1】:

如果您使用 Flask 应用程序,您可以在 Gunicorn 中托管您的应用程序,该应用程序具有多个工作器和线程,通过运行多个工作器来实现并行性。

Gunicorn 启动一个主进程,该进程可以创建多个(已配置的工作人员),其中每个工作人员可以独立处理 HTTP 请求。内核处理工作人员之间的请求负载平衡。

如果您将 Gevent 添加到组合中,这还可以为每个工作人员提供并发性,即每个工作人员将能够同时处理多个请求(而不是并行处理)。

这两个都可以作为 pip 包使用,Gevent 需要安装 libev。

Flask 是一个 WSGI 框架,而 Gunicorn 是一个 WSGI 服务器,这确保了 Gunicorn 对 flask 的支持,它们只是相互插入。

【讨论】:

以上是关于如何在 Python3.7 docker 容器中执行并行 PostgreSQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

dockerCentOS6.8+Python3.7+selenium+Firefox的搭建

dockerCentOS7.4+Python3.7+selenium+Firefox+tesseract的搭建

VS Code 在集成控制台中执行当前行或选择

docker+centos7 + python3.7 + scrapyd 安装过程

如何在python3.7上安装tensorflow [重复]

在带有“kathara Image”的 Docker 容器中执行简单的历史 bash 脚本时出错