擅长:python、mysql、java
<p>我已经找到了问题的答案:genTask示例确实是实现异步调用的最佳方法,这是因为该示例确实使用了Python coroutine,我一眼就不明白,因为我认为yield只用于返回生成器的值。</p>
<p>具体例子:</p>
<pre><code>class MyHandler(tornado.web.RequestHandler):
@asynchronous
@gen.engine
def get(self):
response = yield gen.Task(self.dosomething, 'argument')
</code></pre>
<p>这里重要的是两件事的结合:</p>
<ul>
<li><p><strong>yield</strong>,它实际上生成了一个协程(或伪线程,它非常有效,并且是高度并发友好的)。
<a href="http://www.python.org/dev/peps/pep-0342/" rel="nofollow">http://www.python.org/dev/peps/pep-0342/</a></p></li>
<li><p><code>gen.Task()</code>这是一个非阻塞(异步)函数,因为如果在阻塞函数上生成一个协程,它就不会是异步的。<code>gen.Task()</code>由Tornado提供,专门用于使用Python的协程语法。更多信息:
<a href="http://www.tornadoweb.org/documentation/gen.html" rel="nofollow">http://www.tornadoweb.org/documentation/gen.html</a></p></li>
</ul>
<p>因此,Python中使用协程的异步调用的规范示例如下:</p>
<pre><code>response = yield non_blocking_func(**kwargs)
</code></pre>