обратный вызов торнадо внутри потока - PullRequest
0 голосов
/ 28 ноября 2018

В приведенном ниже примере кода я пытаюсь создать веб-сервер с пулом потоков для обработки запроса get. В send_result () (который вызывается из потока) я использовал обратный вызов торнадо, поскольку документ говоритиспользуйте основной поток для запуска финиша или записи запроса.

Ссылка на документ по безопасности потока: http://www.tornadoweb.org/en/stable/web.html#thread-safety-notes

Если я вызываю API localhost: 4400 / , этосваливания.Я не получаю ответа от сервера

Пожалуйста, помогите мне с этим, что я делаю не так?

Заранее спасибо !!

import tornado.httpserver
import tornado.web
from tornado.ioloop import IOLoop
from tornado.web import asynchronous
from multiprocessing.dummy import Pool as ThreadPool

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', DataHandler)
        ]
        tornado.web.Application.__init__(self, handlers)

class BaseHandler(tornado.web.RequestHandler):

    def handle_error(self, ex):
        def to_do():
            self.set_status(500)
            self.finish(str(ex))
        IOLoop.instance().add_callback(callback=to_do)

    def send_result(self, ret_val):
        def to_do():
            self.set_status(200)
            self.finish(ret_val)
        IOLoop.instance().add_callback(callback=to_do)

class DataHandler(BaseHandler):
    @asynchronous
    def get(self):
        def to_do():
            try:
                self.send_result("hi")
            except Exception as ex:
                self.handle_error(ex)
        pool.apply_async(to_do)

pool = None

def main():
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(4400)
    global pool
    pool = ThreadPool(10)
    print("Server started and listening on 4400")
    IOLoop.instance().start()

if __name__ == "__main__":
    main()
...