如何调试 Tornado 异步操作
how to debug Tornado async operation
本人初学Tornado框架,根据linkAsynchronous and non-Blocking I/O,写了一些demo代码如下。不幸的是,同步 http 客户端有效,但异步 http 客户端无效。看起来,我传递给 AsyncHTTPClient.fetch 的回调函数永远没有机会 运行。所以我的问题是:
- 为什么 tornado 的异步 API 对我不起作用?
- 遇到这种问题应该怎么调试?为我的回调函数设置断点是无用的,因为它从来没有机会 运行.
非常感谢任何帮助。下面是我的演示代码:
from tornado.httpclient import AsyncHTTPClient
from tornado.httpclient import HTTPClient
import time
myUrl = 'a http url serving RESTful service'
def async_fetch(url, callback):
http_client = AsyncHTTPClient()
def handle_test(response):
callback(response.body)
http_client.fetch(url, handle_test)
def sync_fetch(url):
http_client = HTTPClient()
response = http_client.fetch(url)
return response.body
def printResponse(data):
print("response is:" + data)
def main():
sync_fetch(myUrl) #this works
async_fetch(myUrl, printResponse) #this not work
if __name__ == '__main__':
main()
print("begin of sleep!")
time.sleep(2)
print("end of sleep!")
您需要启动 IOLoop,否则您的异步任务永远不会取得进展:
from tornado.ioloop import IOLoop
def printResponse(data):
print("response is:" + data)
IOLoop.current().stop()
def main():
sync_fetch(myUrl) #this works
async_fetch(myUrl, printResponse)
IOLoop.current().start()
在这个例子中,我在 printResponse 的底部停止了循环。在真实的 Web 服务器应用程序中,您可能 永远不会 显式停止循环。
本人初学Tornado框架,根据linkAsynchronous and non-Blocking I/O,写了一些demo代码如下。不幸的是,同步 http 客户端有效,但异步 http 客户端无效。看起来,我传递给 AsyncHTTPClient.fetch 的回调函数永远没有机会 运行。所以我的问题是:
- 为什么 tornado 的异步 API 对我不起作用?
- 遇到这种问题应该怎么调试?为我的回调函数设置断点是无用的,因为它从来没有机会 运行.
非常感谢任何帮助。下面是我的演示代码:
from tornado.httpclient import AsyncHTTPClient
from tornado.httpclient import HTTPClient
import time
myUrl = 'a http url serving RESTful service'
def async_fetch(url, callback):
http_client = AsyncHTTPClient()
def handle_test(response):
callback(response.body)
http_client.fetch(url, handle_test)
def sync_fetch(url):
http_client = HTTPClient()
response = http_client.fetch(url)
return response.body
def printResponse(data):
print("response is:" + data)
def main():
sync_fetch(myUrl) #this works
async_fetch(myUrl, printResponse) #this not work
if __name__ == '__main__':
main()
print("begin of sleep!")
time.sleep(2)
print("end of sleep!")
您需要启动 IOLoop,否则您的异步任务永远不会取得进展:
from tornado.ioloop import IOLoop
def printResponse(data):
print("response is:" + data)
IOLoop.current().stop()
def main():
sync_fetch(myUrl) #this works
async_fetch(myUrl, printResponse)
IOLoop.current().start()
在这个例子中,我在 printResponse 的底部停止了循环。在真实的 Web 服务器应用程序中,您可能 永远不会 显式停止循环。