在使用的库中抑制多线程?

Suppressing multi-threading in used libraries?

编辑: 我最终使用了一种变通方法来获得我想要的行为。 按照接受的答案中的建议禁用 SSHTunnel 中的线程帮助我确定了问题。


我有一个 Python 项目可以做一些事情,主要是 ETL。 当我在本地 运行 它工作正常,当我将它放入 docker 容器和本地 运行 时工作正常,但是当我 运行 docker 云中的容器。

当我手动终止进程时,出现下面链接的错误,提示这是一个线程问题。我没有在我的代码中的任何地方明确地使用线程(并且我不是该主题的专家)并假设它是我正在使用的内部使用线程的库之一。

我必须解决这个问题的想法是以某种方式抑制在我使用的库的函数调用中发生的所有线程。

在 Python 中是否有一个包罗万象的方法?


该程序的步骤包括将 PostGresQL 数据移动到 Google BigQuery,然后从 BigQuery 获取数据(包括新数据),从该数据创建一个 Excel 报告并通过电子邮件发送出去。

Pandas' 数据帧用于内部表示并使用 to_gbq 方法轻松上传到 GBQ。 sqlalchemy 和 sshtunnel 用于从 Postgresql 数据库中提取数据。 Openpyxl 用于 Excel 编辑。

整个过程在 运行 本地(在 docker 容器内或外部)花费不到一分钟的时间,并且在服务器上单独手动调用每个步骤也可以正常工作。 (引用的云部署在 Google 云 VM 实例上)

我想不出任何方法来全局禁用线程;至少在不破坏将使用它的每一段代码的情况下。

根据回溯判断,我假设您使用的是 sshtunnel package. This class takes a boolean argument threaded 中的 SSHTunnelForwarder,默认值为 True

threaded=False 实例化 SSHTunnelForwarderdisable the use of the _ThreadingForwardServer in favor of the _ForwardServer. This forward server is not using the socketserver.ThreadingMixIn,这就是你的块似乎出现的地方。所以,这应该可以解决您的问题。

但是,我很想知道为什么您的项目会在云环境中阻塞。从您的屏幕截图中的输出来看,整个事情似乎几乎完成,只是在关闭隧道转发器时挂起。 sshtunnel 包的维护者肯定将线程的使用作为默认设置是有原因的。如果可能的话,我想坚持使用默认设置,但这就是我:)