<p>但为什么呢?您可以使用<code>AsyncHTTPClient</code>。在</p>
<p>如果你这样做是为了学习,这里有一个概念的概要:</p>
<ol>
<li><p><code>yield</code>和<code>await</code>用于暂停协同程序。但它们不一样。然而,在Tornado中,当<code>yield</code>关键字在一个<code>gen.coroutine</code>修饰函数中时,它们都会执行相同的操作—即在将来(或<a href="https://docs.python.org/3.6/glossary.html#term-awaitable" rel="nofollow noreferrer">awaitable</a>)完成之前挂起一个协程。</p></li>
<li><p><code>return</code>用于从函数返回某些内容,我相信您已经知道了。</p></li>
</ol>
<hr/>
<p>何时使用<code>yield</code>,何时使用<code>await</code>?在</p>
<p>如果使用的Python版本早于3.5,请使用<code>@gen.coroutine ... yield</code>语法。对于3.5+,应该使用<code>async def ... await</code>语法。另外,Tornado不久将推出<a href="https://groups.google.com/d/msg/python-tornado/pErgXjAR77s/IsPH5FuVBQAJ" rel="nofollow noreferrer">drop support for older Python</a>版本,因此最好遵守新语法。在</p>
<p>所以我要指出,把这两者混合起来似乎不是个好主意。通过将<code>@gen.coroutine</code>替换为<code>async</code>,并用<code>await</code>替换{<cd2>},从而摆脱旧的语法。在</p>
<hr/>
<p>关于您的代码的一些注释:</p>
<p>让我们看看<code>_fetch</code>和<code>get</code>方法。他们两个都不还钱。在</p>
<p>为了详细说明,在<code>res = await self._fetch(url, method)</code>的<code>get</code>方法中,<code>res</code>将是{<cd20>},因为{<cd15>}没有返回任何内容。<br/>
同样的情况也发生在<code>ioloop_task</code>的<code>res = http_client.get(url)</code>。<code>res</code>将是<code>None</code>,因为<code>get</code>没有返回任何内容。在</p>
<p>要解决这个问题,只需从<code>_fetch</code>和<code>get</code>方法返回<code>res</code>对象。在</p>
<p>另外,您不需要<code>_fetch</code>方法。您可以在<code>get</code>方法中执行这些操作:</p>
<pre><code>async def get(url):
...
res = await self.fetch(url, method=method)
return res
</code></pre>
<p>实际上,您甚至不需要<code>async ... await</code>语法。这同样有效:</p>
^{pr2}$
<p>为什么第二个代码示例可以很好地工作,我把它作为练习留给您去弄清楚。在</p>