我正在尝试理解非阻塞式Web服务器的想法,似乎有些东西我想念。
我可以理解“阻止”Web请求(伪代码)有几个原因:
CPU绑定
string on_request(arg)
{
DO_SOME_HEAVY_CPU_CALC
返回“完成”;
}
IO绑定
string on_request(arg)
{
DO_A_CALL_TO_EXTERNAL_RESOURCE_SUCH_AS_WEB_IO
返回“完成”;
}
睡眠
string on_request(arg)
{
睡眠(VERY_VERY_LONG_TIME);
返回“完成”;
}
由于
答案 0 :(得分:1)
基本上,非阻塞套接字I / O的工作方式是使用轮询和状态机。因此,您的许多连接方案将是这样的:
connect
操作
send
获取WRITE事件集的人的数据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可能会为您提供有关此主题的一些观点。