Yug*_*dle 1 events tornado event-loop eventmachine node.js
我碰到node.js和python's tornadoVS的Apache.
他们说 :
Node.js&tornado实际上在线程上进行事件循环,单个线程可以处理许多连接.我不明白逻辑上是一个线程的孩子.在计算机科学术语中:
现在,
什么event loop在线程下如何工作?
如何在一个线程的控制下处理不同的连接?
更新:
我的意思是如果在1个线程下有3个套接字的通信,1个线程如何与3个套接字通信而不让任何人等待?
基本级别的事件循环如下:
while getNextEvent (&event) {
dispatchEvent (&event);
}
Run Code Online (Sandbox Code Playgroud)
换句话说,它只不过是一个循环,它连续从某个描述的队列中检索事件,然后将事件调度到事件处理过程.
你可能已经知道了,但我只是在解释它的背景.
就不同服务器如何处理它而言,似乎在Apache中创建的每个新连接都有为其创建的线程,并且该线程负责该连接而不是其他任何事情.
对于另外两个,可能存在"设置"数量的线程正在运行(尽管这可能实际上根据负载而变化)并且连接被切换到其中一个线程.这意味着任何一个线程可能在任何时间点处理多个连接.
因此,在这种情况下,事件必须包含一些关于它适用于哪种连接的细节,因此线程可以保持不同的连接彼此隔离.
毫无疑问,两种选择都有利有弊.每个线程一个连接的选项会简化线程函数中的代码,因为它不需要处理多个连接,但是当负载变高时,它可能会导致大量的资源使用.
在每个线程的多连接方案中,代码稍微复杂一些,但通常只需要始终运行最大线程数就可以最大限度地减少线程创建和破坏开销.在高负荷时期之外,他们只是坐在那里无所事事,等待连接事件给他们.
而且,即使在高负载下,也许每个线程可以非常容易地处理五个并发连接而不会落后,这意味着每个线程的一个连接选项有点浪费.
根据您的更新:
我的意思是如果在1个线程下有3个套接字的通信,1个线程如何与3个套接字通信而不让任何人等待?
有很多方法可以做到这一点.一开始,它通常都会在getNextEvent()调用后被抽象出来,这可能是负责处理所有连接并将它们分配到正确的线程.
在最低级别,这可以通过诸如select调用之类的东西来完成,该函数等待许多文件描述符之一上的活动,并返回与哪个文件描述符有关的信息.
例如,您提供了所有当前打开的套接字的文件描述符集并将其传递给select.然后它将返回一个修改后的集合,仅包含您感兴趣的集合(例如准备读取).
然后,您可以查询该事件并将事件分派给相应的线程.
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |