Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 非阻塞web服务器如何工作?_Asynchronous_Operating System_Tornado_Nonblocking - Fatal编程技术网

Asynchronous 非阻塞web服务器如何工作?

Asynchronous 非阻塞web服务器如何工作?,asynchronous,operating-system,tornado,nonblocking,Asynchronous,Operating System,Tornado,Nonblocking,我试图理解非阻塞web服务器的概念,但似乎我错过了一些东西 我可以理解“阻止”web请求(psuedocode)有几个原因: CPU限制 请求时的字符串(arg) { 是否进行一些较重的CPU计算 返回“完成”; } IO绑定 请求时的字符串(arg) { 是否调用外部资源,如WEB IO 返回“完成”; } 睡眠 请求时的字符串(arg) { 睡眠(很长时间); 返回“完成”; } 三者是否都能从非阻塞服务器中获益 从非阻塞web服务器中获益的情况是如何做到这一点的? 我的意思是,当查看To

我试图理解非阻塞web服务器的概念,但似乎我错过了一些东西

我可以理解“阻止”web请求(psuedocode)有几个原因:

  • CPU限制

    请求时的字符串(arg)
    {
    是否进行一些较重的CPU计算
    返回“完成”;
    }

  • IO绑定

    请求时的字符串(arg)
    {
    是否调用外部资源,如WEB IO
    返回“完成”;
    }

  • 睡眠

    请求时的字符串(arg)
    {
    睡眠(很长时间);
    返回“完成”;
    }

    • 三者是否都能从非阻塞服务器中获益
    • 从非阻塞web服务器中获益的情况是如何做到这一点的? 我的意思是,当查看Tornado服务器文档时,似乎 喜欢它“自由”的线程。我知道一根线是可以睡觉的 并等待来自操作系统(至少在Linux中)的信号, 这就是“释放”线程的意思吗?这个高一点吗 级别执行?实际创建一个新线程的东西 是在等待新的请求而不是“休眠”请求吗
    • 我是不是遗漏了什么

  • 感谢

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

    如何将Linux epoll与Python结合使用,可能会让您了解有关此主题的一些要点。

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

    • 创建多个套接字并使其非阻塞
    • 将它们的状态切换为“连接”
    • 对每个组件启动
      connect
      操作
    • 调查他们所有人,直到一些事件发生
    • 处理启动事件(建立连接或连接失败)
    • 将已建立的状态切换为“发送”
    • 在缓冲区中准备Web请求
    • 轮询“发送”套接字以进行写入操作
    • 为获得写入事件集的人发送数据
    • 对于已发送所有数据的,将状态切换为“接收”
    • 轮询“接收”套接字以进行读取操作
    • 对于已设置读取事件的,执行
      读取
      ,并根据协议处理读取的数据
    • 如果协议是双向的,请重复此操作;如果协议不是双向的,请关闭套接字
    当然,在每个阶段,您都需要处理错误,并且每个套接字的状态都是不同的(一个可能正在连接,另一个可能已经在读取)


    关于投票,我已经发表了一篇文章,介绍了不同的轮询方法在这里的作用:我建议你检查一下。

    你可以考虑接受这个答案,所以当人们想回答更多的问题时,它不会显示“未回答”:谢谢!