python paramiko导致程序挂起(待续)

在开发基于Tornado的Web系统时,发现程序在import包含Paramiko代码的文件后挂起,无法启动。研究发现,Paramiko在尝试读取SSH标题并解码时可能导致导入死锁。尽管有人建议预加载解码器来避免,但这并未解决问题。作者认为在模块级别使用SSH连接不安全,建议将SSH代码封装到类中作为临时解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现问题

几天前做基于tornado的web系统的时候,启动系统后发现无法访问,而且监听特定端口只能同时开启一个进程的web程序居然能开启无限多个,使用netstat -ano |grep 端口号发现web程序根本没有占用端口,说明程序根本没有启动成功,在程序中打断点也没有反应,最后发现程序在import一个文件后就直接挂起了。

这个文件定义了几个控制器类,其开始部分有这样几行代码

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(srv['hostname'], srv['port'], srv['username'], srv['password'])
clients.append(client)

经过调试,在执行client.connect()之后进程就挂起了,下面的代码都无法执行,整个系统就在这里停住了。

寻找答案

首先我百度了很久,结果没有找到什么有用的解释,最后用Google搜到了相关问题(Google大法好!),而且

github上还有专门对此问题开的一个issue,Thread/import related hang issues #104,其中有一个人解释:当paramiko成功读取远程ssh标题并尝试str.decode(’utf-8’),它隐式地从编码模块导入utf-8解码器时,发生导入死锁。
他给出的解决方法是提前调用一次str.decode('utf-8'),防止由于模块导入副作用导致的特定导入,但这个方法我试了之后没有起作用,作者的观点是不推荐在模块中执行模块级别的ssh连接,因为导入产生线程的模块本身就不安全。
看来只能把ssh代码封装到一个类里了,这个问题感觉算不上解决,以后要继续关注,看看有没有什么更优的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值