App Engine Socket API factor 8比原生python慢

2024-09-30 02:30:11 发布

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

我使用的是AE socket API,我做了以下测试:

class TestHandler(webapp.RequestHandler):

    def get(self):
        size = 1024 * 4
        start = datetime.datetime.now()
        for _ in range(10):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(('some.ip.here', 12345))
            sock.send('some dummy data')
            data = ''
            newData = 'dummy'
            while newData != '' and not newData.endswith('\r\n'):
                newData = sock.recv(size)
                #print newData
                data += newData
            print '.'
            sock.close()
        #print 'timespent:' + str(datetime.datetime.now() - start)
        logging.info('timespent:' + str(datetime.datetime.now() - start))
  • 应用引擎实例:0:00:04.022290和0:00:04.209410
  • 本地Python环境:0:00:00.509000和0:00:00.511000

我已经开始做一些测试,因为我注意到一个请求需要大约400毫秒到500毫秒,响应请求的服务器在google GCE实例上。请求的处理时间段平均为0:00:00.0005秒。所以大部分延迟与网络有关。我想一个好的响应时间应该是100毫秒,如果我知道这需要一些硬的东西,我甚至可以用200毫秒。但我不认为这应该有什么不同,除了一些安全方面的东西。但这将禁止某些功能,而不是让它变慢。在

有人能解释一下为什么差别这么大吗?在


Tags: 实例datasizedatetimesomesocketstartnow
1条回答
网友
1楼 · 发布于 2024-09-30 02:30:11

我花了相当长的时间试图重现这个问题,用具体的公共网站,似乎我就是做不到

我的代码版本(足够丰富,因此它实际上运行并显示结果):

import datetime
import logging
import socket
import webapp2

class TestHandler(webapp2.RequestHandler):

    def get(self):
        size = 1024 * 4
        start = datetime.datetime.now()
        for _ in range(10):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(('216.58.216.4', 80))
            sock.send('GET / HTTP/1.0\n\r\n\r')
            data = ''
            newData = 'dummy'
            while newData != '' and not newData.endswith('\r\n'):
                newData = sock.recv(size)
                #print newData
                data += newData
            print '.'
            sock.close()
        msg = 'timespent:{} for:{}'.format(
            datetime.datetime.now() - start, len(data))
        logging.info(msg)
        self.response.write('<p>{}</p>'.format(msg))

app = webapp2.WSGIApplication([
    ('/timit', TestHandler),
], debug=True)

那个IP号码是一个www.google.com(使用主机名www.google.com代替它可能更好,但是您指定了一个IP号,所以我尝试了)而且交互当然只是使用古老的http1.0协议获取其主页。在

结果各不相同,但最典型的是我刚刚得到的结果:

^{pr2}$

我在本地使用dev_appserver.py运行的数字与上传到<myappid>.appspot.com的大致相同。在

所以我做了一个完全独立于GAE的版本:

import datetime
import logging
import socket

def doit():
    size = 1024 * 4
    start = datetime.datetime.now()
    for _ in range(10):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(('216.58.216.4', 80))
        sock.send('GET / HTTP/1.0\n\r\n\r')
        data = ''
        newData = 'dummy'
        while newData != '' and not newData.endswith('\r\n'):
            newData = sock.recv(size)
            #print newData
            data += newData
        print '.'
        sock.close()
    msg = 'timespent:{} for:{}'.format(
        datetime.datetime.now() - start, len(data))
    logging.info(msg)
    print('<p>{}</p>'.format(msg))

doit()

猜猜看,在一堆圆点之后,我发现了一个非常相似的结果

<p>timespent:0:00:02.421856 for:52853</p>

所以我不知道该怎么办。也许一年前你做观察的时候有个问题,现在已经消失了;也许这和你连接到的特定IP的地理位置有关(靠近你的本地机器,远离你的GAE应用程序运行的地方);谁知道没有更多的信息和具体的IP&c,这确实是一个整体,瞎猜你观察到了什么。在

在我的例子中,我现在坐的本地机器是在加利福尼亚州的桑尼维尔,我很确定这两个谷歌服务正在发挥作用(www.google.com以及我的appspot.com),就网络延迟而言,可能离这里不远(我的ping平均为50或60毫秒)。在

这将是一个很好的解决办法,在“未回答的”google app engine问题中投票最高的一个。。。!-)

相关问题 更多 >

    热门问题