python - tornado web http请求阻塞其他请求,如何不阻塞其他请求

标签 python http asynchronous tornado nonblocking

import tornado.web
import Queue

QUEUE = Queue.Queue()

class HandlerA( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        self.finish(QUEUE.get_nowait())

class HandlerB( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        QUEUE.put('Hello')
        self.finish('In queue.')

问题:HandlerA 阻塞 HandlerB 10 秒。

  1. 浏览器 A 由 HandlerA 处理并等待...
  2. 浏览器 B 由 HandlerB 处理并等待....直到超时异常

目标

  1. 浏览器 A 由 HandlerA 处理并等待...
  2. 浏览器 B 由 HandlerB 处理并返回
  3. HandlerA 在出队后返回

这是非阻塞、异步、epoll 或套接字的问题吗?

谢谢!

更新:

我用一个新线程更新了这段代码来处理 Queue.get_nowait() 请求。考虑到我将同时处理数以千计的请求,因此我将同时处理数以千计的线程,我担心这是一个可怕的解决方案。我正在考虑在不久的将来转向 epoll 风格。

class HandlerA( tornado.web.RequestHandler ):
    @tornado.web.asynchronous
    def get(self):
       thread.start_new_thread(self.get_next)

    def get_next(self):
        global QUEUE
        self.finish(QUEUE.get_nowait())

现在这不是处理它的最佳方式......但至少它是一个开始。

解决方案

在这里找到Running blocking code in Tornado

最佳答案

这是 Python。所以,time.sleep 会一直阻塞流!为了在 10 秒后使用 Tornado 调用操作,您需要使用 tornado.ioloop.add_timeout 函数并将回调作为参数传递。 Docs for more information .

关于python - tornado web http请求阻塞其他请求,如何不阻塞其他请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13961863/

相关文章:

python - Pandas 中 "in"关键字或子查询的等价物

http - go语言如何通过http请求下载文件

javascript - jQuery同步异步请求按顺序

javascript - 如何在 Promise 完成后调用 axios 中的数组元素

jquery - 如何将由 ajax HTTP POST 创建的资源的 ID 返回给客户端

javascript - 如何从委托(delegate) AsyncCallback 函数调用 javascript 函数?

python - 如何在 pandas 中编写 SQL 窗口函数

Python迷宫生成器解释

python - SQLAlchemy 中的导入错误

c# - 监听 HTTP 请求