<p>所以,经过一番研究,我想我找到了在全球范围内执行协同程序的最简单的解决方案。在</p>
<p><strong>如果<code>>>> dir(coro)</code>Python将打印出以下属性:</strong></p>
<pre><code>['__await__', '__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'cr_await', 'cr_code', 'cr_frame', 'cr_origin', 'cr_running', 'send', 'throw']
</code></pre>
<p><strong>有几个属性非常突出,即:</strong></p>
^{pr2}$
<p>在阅读了<a href="https://stackoverflow.com/questions/45899681/python-what-does-yield-yield-do">what does yield (yield) do?</a>以及生成器的工作原理之后,我认为send方法一定是关键。在</p>
<p><strong>所以我试着:</strong></p>
<pre><code>>>> the_actual_coro = coro()
<coroutine object coro at 0x7f5afaf55348>
>>>the_actual_coro.send(None)
</code></pre>
<p><strong>它引发了一个有趣的错误:</strong></p>
<pre><code>Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration: a value
</code></pre>
<p>它实际上给了我一个<strong>异常的返回值</strong>!在</p>
<p><strong>所以我认为一个非常基本的循环,嗯,它更像是一个运行器,可以这样实现:</strong></p>
<pre><code>def run(coro):
try:
coro.send(None)
except StopIteration as e:
return e.value
</code></pre>
<p><strong>现在,我可以在同步函数中运行协同程序,甚至可以全局运行,但我不建议这样做。但是,了解运行协同程序的最简单和最低级别是很有趣的</strong></p>
<pre><code>>>> run(coro())
'a value'
</code></pre>
<p>然而,当<code>coro</code>有一些事情要等待时,它将返回<code>None</code>(这实际上是作为一个协程的本质)。在</p>
<p>我认为这可能是因为事件循环通过将它们分配给futures并分别处理它们来处理它的协程(<code>coro.cr_frame.f_locals</code>)的等待项?我的简单<code>run</code>函数显然没有提供。在这方面我可能错了。所以如果我错了,请有人纠正我。在</p>