擅长:python、mysql、java
<p>在编程中有两种处理异步事件的方法</p>
<p>一种方法是使用中断:您的代码在被某种机制“唤醒”之前不会执行,然后执行。必须在低于代码执行位置的级别上支持此机制。例如,微控制器具有内置的特定硬件,可以中断应用程序并跳转到特定地址以开始执行指令以处理中断</p>
<p>构建一个中断系统是很困难的,并且需要大量的工作。对于某些应用程序,这是不可能的。几乎总是更容易(尽管效率较低)轮询,或者反复检查一个条件,直到它变为真,然后继续执行其他操作</p>
<p>在您的示例中,请注意他是如何使用<code>while True:</code>循环的。True永远不会为False,因此这个while循环只能由<code>break</code>语句中断。我们在</p>
<pre class="lang-py prettyprint-override"><code>if session.exit_status_ready():
break
</code></pre>
<p>因此,代码的作者决定不断地做一些事情,直到<code>session.exit_status_ready()</code>为真。由于这是paramiko,他很可能通过SSH执行了一个远程命令,并等待该命令完成并返回退出代码。这个循环的目的是让程序一直卡在循环中,直到命令执行完毕并返回结果。它还可以超时:</p>
<pre class="lang-py prettyprint-override"><code>if et_secs > maxseconds:
self.info('polling finished - timeout')
timeout_flag = True
break
</code></pre>
<p>因此,如果命令花费的时间超过<code>maxseconds</code>,程序将不会永远等待</p>
<p>一旦退出循环,它将打印:</p>
<pre class="lang-py prettyprint-override"><code>self.info('polling loop ended')
</code></pre>
<p>因此,当您看到此消息时,您知道远程命令已完成执行或超时</p>
<p>轮询的目的是反复检查某些内容,直到出现某种情况。在您的情况下,该条件是“远程命令已完成执行”或“已过一定时间”</p>