从 1.2 升级到 2.0 后,Tornado 的 AsyncHTTPClient 不再工作
我决定今晚尝试一下 Tornado 2.0,但它似乎在 ASyncHTTPClient 上为我做了很多工作。 2.0 的发行说明中没有任何内容表明我使用 ASyncHTTPClient 的方式有必要进行任何真正的更改:
[编辑:使代码更像是一个明确的、自包含的示例]
import time
import threading
import functools
import tornado.ioloop
import tornado.web
from tornado.httpclient import *
class MainHandler(tornado.web.RequestHandler):
def perform_task(self,finish_function):
http_client = AsyncHTTPClient()
tornado.ioloop.IOLoop.instance().add_callback(finish_function)
# do something
for i in range(0,10):
print i
time.sleep(1)
request = tornado.httpclient.HTTPRequest("http://10.0.1.5:8888",method="POST",body="finished countdown")
resp = http_client.fetch(request, self.handle_request)
return
def join_callback(self):
# finish the request, also returns control back to ioloop's thread.
self.finish()
def handle_request(self, response):
if response.error:
print "Error:", response.error
else:
print response.body
@tornado.web.asynchronous
def get(self):
self.write("Kicking off.")
a_partial = functools.partial(self.perform_task,self.join_callback)
self.thread = threading.Thread(target=a_partial)
self.thread.start()
self.write("\n<br/>Done in here, out of my hands now.")
# just so this example has something to post to
@tornado.web.asynchronous
def post(self):
self.write("POSTED: %s" % (self.request.body))
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
使用默认值(非-curl) ASyncHTTPClient 我得到以下信息:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 259, in cleanup
yield
File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 186, in __init__
functools.partial(self._on_connect, parsed))
File "/usr/local/lib/python2.6/dist-packages/tornado/iostream.py", line 120, in connect
self.socket.connect(address)
AttributeError: 'NoneType' object has no attribute 'connect'
如果我添加: Tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
指定我想使用 PyCurl,我得到以下异常:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "migratotron.py", line 46, in perform_migration
hc.fetch(request,success)
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 81, in fetch
self._process_queue()
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 210, in _process_queue
curl.info["headers"])
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 276, in _curl_setup_request
curl.setopt(pycurl.URL, request.url
)
TypeError: invalid arguments to setopt
我正在做的唯一不寻常的事情是调用这是我创建的另一个线程来做一些背景处理,它使用 add_callback 将控制权返回给 ioloop 线程。有人在 2.0 或类似的版本中见过这个吗?
Decided I'd kick the tires of Tornado 2.0 tonight, but it appears to have done a number on ASyncHTTPClient for me. Nothing in the release notes for 2.0 indicates any real changes are necessary to how I'm using ASyncHTTPClient:
[EDIT: made the code more of an explicit, self-containing example ]
import time
import threading
import functools
import tornado.ioloop
import tornado.web
from tornado.httpclient import *
class MainHandler(tornado.web.RequestHandler):
def perform_task(self,finish_function):
http_client = AsyncHTTPClient()
tornado.ioloop.IOLoop.instance().add_callback(finish_function)
# do something
for i in range(0,10):
print i
time.sleep(1)
request = tornado.httpclient.HTTPRequest("http://10.0.1.5:8888",method="POST",body="finished countdown")
resp = http_client.fetch(request, self.handle_request)
return
def join_callback(self):
# finish the request, also returns control back to ioloop's thread.
self.finish()
def handle_request(self, response):
if response.error:
print "Error:", response.error
else:
print response.body
@tornado.web.asynchronous
def get(self):
self.write("Kicking off.")
a_partial = functools.partial(self.perform_task,self.join_callback)
self.thread = threading.Thread(target=a_partial)
self.thread.start()
self.write("\n<br/>Done in here, out of my hands now.")
# just so this example has something to post to
@tornado.web.asynchronous
def post(self):
self.write("POSTED: %s" % (self.request.body))
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
when using the default (non-curl) ASyncHTTPClient I get the following:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 259, in cleanup
yield
File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 186, in __init__
functools.partial(self._on_connect, parsed))
File "/usr/local/lib/python2.6/dist-packages/tornado/iostream.py", line 120, in connect
self.socket.connect(address)
AttributeError: 'NoneType' object has no attribute 'connect'
if I add in:
tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
to specify I want to use PyCurl, I get the following exception:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "migratotron.py", line 46, in perform_migration
hc.fetch(request,success)
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 81, in fetch
self._process_queue()
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 210, in _process_queue
curl.info["headers"])
File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 276, in _curl_setup_request
curl.setopt(pycurl.URL, request.url
)
TypeError: invalid arguments to setopt
The only thing unusual I'm doing is calling this is another thread I created to do some background processing, which uses add_callback to return control to the ioloop thread. Has anyone seen this with 2.0 or anything like it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这些错误消息有点神秘,但在这两种情况下,我认为它们是由于您的请求没有 URL(除非
callback
是 URL)。2.0 将 ASyncHTTPClient 实现切换为 simple_httpclient (来自curl_httpclient),但我认为给出的示例在 Tornado 1.2 中也不起作用。
Those error messages are a bit cryptic, but in both cases I think they're due to your request not having a URL (unless
callback
is a URL).2.0 switched the ASyncHTTPClient implementation to simple_httpclient (from curl_httpclient), but I don't think the example given would have worked in Tornado 1.2 either.