python http服务器,多个同时请求

Lan*_*don 6 python http tornado

我开发了一个使用龙卷风用python编写的相当广泛的htt​​p服务器.如果没有设置任何特殊内容,服务器将阻止请求,并且一次只能处理一个.请求基本上访问数据(mysql/redis)并在json中打印出来.在最坏的情况下,这些请求可能需要一秒钟的时间.问题是请求进来需要很长时间(3s),然后一个简单的请求立即进入,需要5ms处理.好吧,因为第一个请求将需要3秒,第二个请求在第一个请求完成之前不会启动.因此第二个请求需要> 3秒才能处理.

我怎样才能让这种情况变得更好?无论其他请求如何,我都需要第二个简单的请求才能开始执行.我是python的新手,对apache/php更有经验,其中没有两个单独请求相互阻塞的概念.我已经调查了mod_python以模拟php示例,但这似乎也阻止了.我可以更改龙卷风服务器以获得我想要的功能吗?我读到的每个地方都说龙卷风非常适合处理多个同时发出的请求.

这是我正在使用的演示代码.我有一个睡眠命令,我用它来测试并发是否有效.睡觉是一种测试并发性的公平方法吗?

import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.gen
import time

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine

    def handlePing1(self):
        time.sleep(4)#simulating an expensive mysql call
        self.write("response to browser ....")
        self.finish()

    def get(self):
        start = time.time()
        self.handlePing1()
        #response = yield gen.Task(handlePing1)#i see tutorials around that suggest using something like this ....

        print "done with request ...", self.request.path, round((time.time()-start),3)



application = tornado.web.Application([
        (r"/.*", MainHandler),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    port=8833;
    http_server.listen(port)
    print "listening on "+str(port);
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

eri*_*eri 0

我有同样的问题,但没有龙卷风,没有mysql。您是否有一个与所有服务器共享的数据库连接?

我创建了一个multiprocessing.Pool. 每个函数都有自己的数据库连接init。我将慢速代码包装在函数中并将map其放入池中。所以我没有共享变量和连接。

睡眠不会阻塞其他线程,但数据库事务可能会阻塞线程。

您需要在代码顶部设置池。

def spawn_pool(fishes=None):
    global pool
    from multiprocessing import Pool
    def init():
        from storage import db #private connections
        db.connect() #connections stored in db-framework and will be global in each process
    pool = Pool(processes=fishes,initializer=init)

if __name__ == "__main__":
    spawn_pool(8)


from storage import db #shared connection for quick-type requests.

#code here

if __name__ == "__main__":
    start_server()
Run Code Online (Sandbox Code Playgroud)

许多并发的快速请求可能会减慢一个大请求的速度,但这种并发只会发生在数据库服务器上。