Python Tornado阻塞仅在Linux上的AsyncHTTPClient中。不在windows或OSX上

2024-06-06 16:36:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我从Tornado AsyncHTTPClient客户端得到了非常奇怪的行为。在

当我在Windows、OSX、Ubuntu、Redhat和Amazon AMI上运行相同的代码时,我的代码的行为有所不同。在

以下是相关代码:

 request = HTTPRequest(self.URL,
                      method="POST",
                      auth_username=self.USERNAME,
                      auth_password=self.PASSWORD,
                      headers=self.HEADERS,
                      body=formatted_request
                      )
try:
  print "before", datetime.now()
  future = self.HTTP_CLIENT.fetch(request, self.handle_response)
  print "after", datetime.now()

在OSX和Winodws上,此代码的输出是(非阻塞):

^{pr2}$

在Ubuntu、Redhat和amazon AMI上,我得到了这样的结果(应该是非阻塞代码的时间间隔为2秒):

before 2015-10-27 21:49:23.644458
after 2015-10-27 21:49:25.541746
before 2015-10-27 21:49:25.542827
after 2015-10-27 21:49:27.428840
before 2015-10-27 21:49:27.429993
after 2015-10-27 21:49:29.326183
before 2015-10-27 21:49:29.327549

我在tornado代码中注意到linux和osx之间有区别:

We use epoll (Linux) or kqueue (BSD and Mac OS X) if they are available, or else we fall back on select(). If you are implementing a system that needs to handle thousands of simultaneous connections, you should use a system that supports either epoll or kqueue.

但不同平台之间的性能差异似乎不太可能是epoll/kqueue问题。在

我使用的是python2.7和tornado 4.2.1。版本是从AWS实例的起始页下载的。在

任何想法都将不胜感激!在

谢谢, 乔恩


Tags: or代码selfauthdatetimerequestubuntuprint
1条回答
网友
1楼 · 发布于 2024-06-06 16:36:40

区别可能在于DNS解析,默认情况下是阻塞的。当它很快的时候,你会得到一个缓存的结果,而当它不快的时候,你会去原始的名称服务器(如果需要2秒的话,可能会和一个非最佳的解析器对话)。在

尝试安装futures包并执行tornado.netutil.Resolver.configure("tornado.netutil.ThreadedResolver")。在

相关问题 更多 >