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