编辑: 我最终使用一种解决方法来获得所需的行为。 按照接受的答案中的建议禁用SSHTunnel中的线程帮助我确定了问题所在。
我有一个Python项目,可以完成一些工作,主要是ETL。 当我在本地运行它时,它工作正常;当我将其填充到docker容器中并在本地运行时,它运行良好;但是当我在云中运行该Docker容器时,死锁达到80%。
当我手动终止进程时,出现下面的错误链接,表明这是线程问题。我没有在代码的任何地方显式地使用线程(并且不是该主题的专家),并假定它是我在内部使用线程的库之一。
我必须解决此问题的想法是以某种方式抑制我使用的库的函数调用中发生的所有线程。
在Python中有一种万能的方法吗?
该程序的步骤包括将PostGresQL数据移至Google BigQuery中,然后从BigQuery中获取数据(包括新数据),从该数据创建Excel报告并通过电子邮件发送出去。
Pandas的数据帧用于内部表示,并使用to_gbq方法轻松上传到GBQ。 sqlalchemy和sshtunnel用于从Postgresql数据库提取数据。 Openpyxl用于Excel编辑。
整个过程不到一分钟即可在本地运行(在Docker容器内或外部),并且在服务器上手动分别调用每个步骤也可以正常工作。 (引用的云部署在Google Cloud VM实例上)
答案 0 :(得分:1)
我想不出任何方法来全局禁用线程;至少不会破坏所有会使用它的代码。
从回溯来看,我假设您正在使用sshtunnel
包中的SSHTunnelForwarder
。此类采用布尔型参数threaded
,其中True
为默认值。
用SSHTunnelForwarder
实例化threaded=False
将使disable the use中的_ThreadingForwardServer
偏向于_ForwardServer
。该转发服务器未使用socketserver.ThreadingMixIn
,这似乎是您的块出现的位置。因此,应该可以解决您的问题。
但是,我很想知道为什么您的项目在云环境中会阻塞。从屏幕截图中的输出来看,整个过程似乎已经完成,并且在关闭隧道转发器时挂起了。 sshtunnel
软件包的维护者肯定会使用线程默认设置是有原因的。我想尽可能地使用默认值,但这只是我自己:)