Обработка нескольких входящих запросов с помощью Python tornado - PullRequest
0 голосов
/ 23 мая 2018

У меня есть код, который отлично работает для одного запроса пользователя.Однако он не может обработать несколько запросов, он ожидает завершения одного запроса и затем обрабатывает вторые запросы.Как я могу обрабатывать несколько запросов одновременно.

import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado import gen
import random
import time
import sys

Это класс, имитирующий некоторые входящие данные.

class Message():


    def __init__(self):
        self.dct = {'foo': 0, 'bar': 0, 'durrr': 0}
        self.keys = list(self.dct.keys())


    def update_key(self):
        dct_key = random.choice(self.keys)
        ran = random.choice(range(10, 21))
        self.dct[dct_key] += ran
        if self.dct[dct_key] >= 100:
            self.dct[dct_key] = 'Loading Completed'
            self.keys.remove(dct_key)


    def is_completed(self):
        return True if self.keys == [] else False


    def __str__(self):
        strng = ''
        for key, value in self.dct.items():
            if type(value) == int:
                strng += '{}: {}% completed.<br>'.format(key, value)
            else:
                strng += '{}: {}<br>'.format(key, value)
        return strng

Этот класс отправляет данные через сокет.

class EchoWebSocket(tornado.websocket.WebSocketHandler):


    def open(self):
        print("WebSocket opened")


    def on_message(self, message):
        msg = Message()
        while not msg.is_completed():
            msg.update_key()
            try:
                fut = self.write_message('Download progress for user xyz:<br>{}Download in progress! Please wait...<br>'.format(msg.__str__()))
                print(fut)
            except tornado.websocket.WebSocketClosedError:
                print('WebSocket is closed')
                break
            time.sleep(1)
        self.write_message('Download progress for user xyz:<br>{}Download completed. You may proceed.'.format(msg.__str__()))
        #sys.exit('Program terminated.')


    def on_close(self):
        print("WebSocket closed")

Основной класс прост.Оказывает немного HTML.Основной движок находится в EchoWebSocket.

class Main(tornado.web.RequestHandler):


    def get(self):
        self.render('counter2.html', title='Websockets')


application = tornado.web.Application([
    (r"/", Main),
    (r"/websocket", EchoWebSocket),
])


if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

И html:

<!doctype html>
<html>
   <head>
       <title>Tornado Test</title>
       <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
    </head>
    <body>
        <script>    
            $(document).ready(function () {
                var ws = new WebSocket("ws://localhost:8888/websocket");
                ws.onopen = function() {
                    ws.send("Hello, world");
                };
                ws.onmessage = function (evt) {
                    document.getElementById("myDIV").innerHTML = evt.data + "<br>";
                };
            });
        </script>
        <div id="myDIV"></div>
  </body>
</html>

1 Ответ

0 голосов
/ 23 мая 2018

Вы используете time.sleep(1).Но time.sleep - это функция блокировки, то есть она остановит весь сервер, и больше ничего не сможет работать в течение этого времени.

Это также упоминалось в Tornado FAQs page .

. Вам нужна асинхронная функция сна.Торнадо имеет gen.sleep.Используйте это так:

async def my_func():
    ...
    await gen.sleep(1)
...