擅长:python、mysql、java
<p>这两个例子在事件排序方面并不相等。
让我们看看未来的生命周期。大致上是这样的(<em>从cpython的来源逆向工程</em>):</p>
<ul>
<li>创造未来</li>
<li>它被添加到执行者的队列中</li>
<li>它是由线程池中的某个空闲/空闲线程从队列中弹出的</li>
<li>提供给<code>submit()</code>的函数在该线程中被调用</li>
<li>未来被标记为已完成</li>
<li><em>future向其所有服务员广播“状态更改”事件</em></li>
<li>调用回调(仍在同一工作线程中)</li>
<li>工作线程变为空闲/空闲,并可能从队列中获取另一个未来</li>
</ul>
<p>当您执行语句<code>print(future.result())</code>时,您的主线程阻塞并成为未来的服务员。在future切换到FINISHED之后,但在回调开始执行之前,它就被解除了阻塞。这意味着您无法预测在控制台中打印的第一步是什么-<code>print</code>在任何回调中,或者<code>print(future(result))</code>-它们现在是并行执行的。如果在等待<code>future.result()</code>完成后在回调和主线程中处理相同的数据,则很可能会导致数据损坏。你知道吗</p>