Tôi đã phát triển một máy chủ http khá rộng rãi được viết bằng python sử dụng lốc xoáy. Nếu không đặt bất cứ điều gì đặc biệt, máy chủ sẽ chặn các yêu cầu và chỉ có thể xử lý một yêu cầu tại một thời điểm. Các yêu cầu về cơ bản truy cập dữ liệu (mysql/redis) và in nó ra trong json. Những yêu cầu này có thể mất tới một giây trong trường hợp xấu nhất. Vấn đề là một yêu cầu đến trong đó mất một thời gian dài (3s), sau đó một yêu cầu dễ dàng đến ngay lập tức sau đó sẽ mất 5ms để xử lý. Vì yêu cầu đầu tiên sẽ mất 3 giây, yêu cầu thứ hai không bắt đầu cho đến khi yêu cầu đầu tiên được thực hiện. Vì vậy, yêu cầu thứ hai mất> 3s để được xử lý.python http server, nhiều yêu cầu đồng thời
Làm cách nào để cải thiện tình trạng này? Tôi cần yêu cầu đơn giản thứ hai đó để bắt đầu thực hiện bất kể yêu cầu nào khác. Tôi mới đến python, và nhiều kinh nghiệm với apache/php, nơi không có khái niệm về hai yêu cầu riêng biệt ngăn chặn lẫn nhau. Tôi đã nhìn vào mod_python để mô phỏng ví dụ php, nhưng điều đó dường như cũng chặn. Tôi có thể thay đổi máy chủ lốc xoáy của mình để có được chức năng mà tôi muốn không? Ở khắp mọi nơi tôi đọc, nó nói rằng cơn lốc xoáy là rất tốt trong việc xử lý nhiều yêu cầu đồng thời.
Đây là mã demo mà tôi đang làm việc. Tôi có một lệnh ngủ mà tôi đang sử dụng để kiểm tra nếu đồng thời hoạt động. Ngủ một cách công bằng để kiểm tra đồng thời?
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()
Cảm ơn bạn đã được trợ giúp!