非阻塞Web服务器如何工作?

时间:2014-01-15 11:16:14

标签: asynchronous operating-system tornado nonblocking

我正在尝试理解非阻塞式Web服务器的想法,似乎有些东西我想念。

我可以理解“阻止”Web请求(伪代码)有几个原因:

  1. CPU绑定

    string on_request(arg)
    {
       DO_SOME_HEAVY_CPU_CALC
       返回“完成”;
    }

  2. IO绑定

    string on_request(arg)
    {
          DO_A_CALL_TO_EXTERNAL_RESOURCE_SUCH_AS_WEB_IO
          返回“完成”;
    }

  3. 睡眠

    string on_request(arg)
    {
          睡眠(VERY_VERY_LONG_TIME);
          返回“完成”;
    }

    • 三者都能从非阻塞服务器中受益吗?
    • 如何从非阻塞Web服务器中获益的情况真的如此? 我的意思是,在查看Tornado服务器文档时,似乎 喜欢它“免费”的线程。我知道一个线程可以进入睡眠状态 并等待来自操作系统的信号(至少在Linux中), 这是“释放”线程的意思吗?这是一些更高 水平实施?实际上创建一个新线程的东西 那是在等待新的请求而不是“睡觉”的请求?
    • 我在这里错过了什么吗?
  4. 由于

3 个答案:

答案 0 :(得分:1)

基本上,非阻塞套接字I / O的工作方式是使用轮询和状态机。因此,您的许多连接方案将是这样的:

  • 创建许多套接字并使其无阻塞
  • 将其状态切换为“连接”
  • 对每个
  • 启动connect操作
  • 对所有这些事件进行轮询,直到某些事件发生
  • 处理已启动的事件(建立连接或连接失败)
  • 将建立的状态切换为“发送”
  • 在缓冲区中准备Web请求
  • 轮询“发送”套接字进行WRITE操作
  • send获取WRITE事件集的人的数据
  • 对于已发送所有数据的用户,请将状态切换为“正在接收”
  • 轮询“接收”套接字以进行READ操作
  • 对于那些设置了READ事件的人,执行read并根据协议处理读取的数据
  • 如果协议是双向的,则重复,如果不是
  • ,则关闭套接字

当然,在每个阶段你需要处理错误,并且每个套接字的状态是不同的(一个可能是连接而另一个可能已经在读取)。

关于民意调查我发布了一篇关于不同民意调查方法如何运作的文章:http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/ - 我建议你检查一下。

答案 1 :(得分:0)

要从非阻塞服务器中受益,您的代码也必须是非阻塞的 - 您不能只在非阻塞服务器上运行阻塞代码并期望获得更好的性能。例如,您必须删除对sleep()的所有调用,并将其替换为非阻塞等效项,如IOLoop.add_timeout(这反过来又涉及重构代码以使用回调或协同程序)。

答案 2 :(得分:0)

如何在Python http://scotdoyle.com/python-epoll-howto.html中使用Linux epoll可能会为您提供有关此主题的一些观点。