从 1.2 升级到 2.0 后,Tornado 的 AsyncHTTPClient 不再工作

发布于 2024-11-17 18:17:13 字数 3330 浏览 1 评论 0原文

我决定今晚尝试一下 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

韶华倾负 2024-11-24 18:17:13

这些错误消息有点神秘,但在这两种情况下,我认为它们是由于您的请求没有 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文