我从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) orkqueue
(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 eitherepoll
orkqueue
.
但不同平台之间的性能差异似乎不太可能是epoll/kqueue问题。在
我使用的是python2.7和tornado 4.2.1。版本是从AWS实例的起始页下载的。在
任何想法都将不胜感激!在
谢谢, 乔恩
区别可能在于DNS解析,默认情况下是阻塞的。当它很快的时候,你会得到一个缓存的结果,而当它不快的时候,你会去原始的名称服务器(如果需要2秒的话,可能会和一个非最佳的解析器对话)。在
尝试安装
futures
包并执行tornado.netutil.Resolver.configure("tornado.netutil.ThreadedResolver")
。在相关问题 更多 >
编程相关推荐