当前位置: 首页 > 面试题库 >

为什么在加载模块时使用Paramiko挂起?

诸葛雨泽
2023-03-14
问题内容

将以下内容放入文件 hello.py中easy_install paramiko如果还没有的话):

hostname,username,password='fill','these','in'
import paramiko
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect(hostname=hostname, username=username, password=password)
i,o,e = c.exec_command('ls /')
print(o.read())
c.close()

适当填写第一行。

现在输入

python hello.py

您会看到一些ls输出。

现在输入

python

然后从解释器类型中

import hello

和瞧!挂了!如果将代码包装在一个函数中fooimport hello; hello.foo()而是执行此操作,它将解开。

在模块初始化中使用Paramiko时为什么会挂起? Paramiko甚至如何知道它最初是在模块初始化期间使用的?


问题答案:

Paramiko使用单独的线程进行基础传输。您 永远不会
有一个模块会由于导入而产生线程。据我了解,这里只有一个导入锁,因此,当模块中的子线程尝试另一次导入时,它可能会无限期地阻塞,因为您的主线程仍然持有该锁。(可能还有其他我也不知道的陷阱)

通常,模块在导入时不应有任何种类的副作用,否则您将获得不可预测的结果。只需用这个__name__ == '__main__'技巧推迟执行,就可以了。

[编辑]我似乎无法创建一个简单的测试用例来重现此死锁。我仍然认为这是导入的线程问题,因为auth代码正在等待永远不会触发的事件。这可能是paramiko或python中的错误,但是好消息是,如果做正确的事,就永远不要看到它;)

这是一个很好的例子,为什么您总是要最大程度地减少副作用,并且为什么函数式编程技术变得越来越普遍。



 类似资料:
  • 展示了如何调试问题,即PHP模块没有加载到PHP中。 我使用OpenSUSEV42。2个Linux操作系统,带有Apache Web服务器,PHP v7。1、Mysql。 因为它不提供PHPV7。1我需要,我构建了PHPV7。1来源。使用PHP-FPM。 我把它安装到 php.ini在: 我发现,opcache安装到 我编辑了php。ini并添加了以下行: 重新启动: 但我还是得到了以下结果: [

  • 本文向大家介绍Node的模块加载机制是什么?相关面试题,主要包含被问及Node的模块加载机制是什么?时的应答技巧和注意事项,需要的朋友参考一下 解析路径为绝对路径,判断模块缓存中是否存在,存在则返回 根据路径创建模块,并添加到缓存中。 根据加载规则加载模块 3.1 判断文件后缀,如果不存在,则判断是文件夹还是文件,文件则按照js、json、node等后缀添加 3.2 如果添加后缀后文件不存在则返回

  • 问题内容: 我正在尝试运行嵌入示例,除非我将其明确添加到当前工作目录中,否则无法从当前工作目录中加载该模块: Python是否不应该在当前目录中查找模块? Edit1 :尝试使用以下命令导入模块: 并且仍然失败,并显示以下错误: Edit2 :从 文档中: 如果脚本目录不可用(例如,如果解释器是交互式调用的,或者从标准输入中读取了脚本),则path [0] 是空字符串,它指示Python首先在当前

  • -或者- 或者我应该以目前相同的模块方式设置它们?我正在尝试,但它总是给我错误,不知道如何在没有类的模块中!

  • 问题内容: 我正在使用:IntelliJ IDEA 11.1.3(社区版)和Maven 3.0.4。 该项目包含几个模块,其中一个模块创建一个war文件。当我使用“ mvn idea:idea”时,IntelliJ由于某种原因无法加载此模块。错误消息是:“ 10:40:04 AM错误加载项目:无法加载模块” 我可以通过手动导入现有模块来解决此问题,但这是一个非常烦人的问题。有谁知道为什么会这样,这

  • 问题内容: 我放 进入我的django项目。当我现在跑步时,我得到 为什么要运行两次?它应该只加载一次。 问题答案: 每个进程只能加载一次。我猜这是分叉的,并且启动了两个单独的过程。你可以打印的结果吗?