Tornado 6.1非阻塞请求

2024-10-02 12:27:43 发布

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

使用Tornado,我有一个POST请求,需要很长时间,因为它向另一个API服务发出许多请求并处理数据。这可能需要几分钟才能完全完成。我不希望这会阻止整个web服务器响应其他请求,而它目前正是这样做的

我在这里查看了多个线程,但它们通常都有8年的历史,并且代码不再有效,因为tornado从tornado.gen中删除了“引擎”组件

有没有一种简单的方法来启动这个长时间的get调用,而不让它在这个过程中阻塞整个web服务器?我能在密码里说些什么吗。。“提交POST响应并使用此函数,而不阻止任何并发服务器请求获得即时响应”

例如: main.py

def make_app():
        return tornado.web.Application([
                (r"/v1", MainHandler),
                (r"/v1/addfile", AddHandler, dict(folderpaths = folderpaths)),
                (r"/v1/getfiles", GetHandler, dict(folderpaths = folderpaths)),
                (r"/v1/getfile", GetFileHandler, dict(folderpaths = folderpaths)),
                ])




if __name__ == "__main__":
        
        app = make_app()
        sockets = tornado.netutil.bind_sockets(8888)
        tornado.process.fork_processes(0)
        tornado.process.task_id()
        server = tornado.httpserver.HTTPServer(app)
        server.add_sockets(sockets)
        tornado.ioloop.IOLoop.current().start()

addHandler.py



class AddHandler(tornado.web.RequestHandler):
    
    def initialize(self, folderpaths):
        self.folderpaths = folderpaths


    def blockingFunction(self):
        time.sleep(320)
        post("AWAKE")

    def post(self):

        user = self.get_argument('user')
        folderpath = self.get_argument('inpath')
        outpath = self.get_argument('outpath')
        workflow_value = self.get_argument('workflow')

        status_code, status_text = validateInFolder(folderpath)

        
        if (status_code == 200):
            logging.info("Status Code 200")
            result = self.folderpaths.add_file(user, folderpath, outpath, workflow_value)
            self.write(result)
            self.finish()

            #At this point the path is validated.
            #POST response should be send out. Internal process should continue, new 
            #requests should not be blocked
            
            self.blockingFunction()

其想法是,如果输入参数得到验证,则应发送POST响应。 然后应启动内部进程(blockingFunction()),该进程不应阻止Tornado服务器处理另一个API POST请求

我尝试将(blockingFunction())定义为async,这允许我处理多个并发的用户请求-但是有一个关于async方法缺少“wait”的警告

欢迎任何帮助。多谢各位


Tags: self服务器webappgetdefargumentpost
1条回答
网友
1楼 · 发布于 2024-10-02 12:27:43
class AddHandler(tornado.web.RequestHandler):
    
    def initialize(self, folderpaths):
        self.folderpaths = folderpaths


    def blockingFunction(self):
        time.sleep(320)
        post("AWAKE")

    async def post(self):

        user = self.get_argument('user')
        folderpath = self.get_argument('inpath')
        outpath = self.get_argument('outpath')
        workflow_value = self.get_argument('workflow')

        status_code, status_text = validateInFolder(folderpath)

        
        if (status_code == 200):
            logging.info("Status Code 200")
            result = self.folderpaths.add_file(user, folderpath, outpath, workflow_value)
            self.write(result)
            self.finish()

            #At this point the path is validated.
            #POST response should be send out. Internal process should continue, new 
            #requests should not be blocked

            await loop.run_in_executor(None, self.blockingFunction)

            #if this had multiple parameters it would be 
            #await loop.run_in_executor(None, self.blockingFunction, param1, param2)

谢谢@xyres

进一步阅读:https://www.tornadoweb.org/en/stable/faq.html

相关问题 更多 >

    热门问题