在逻辑上什么是线程中的事件循环?

我遇到了node.jspython's tornadoApache

他们说 :

  • Apache为每个连接创build一个线程。
  • Node.jstornado实际上是在线程上进行事件循环,而单个线程可以处理多个连接。

我不明白,逻辑上是一个线程的孩子。 在计算机科学方面:

  • 进程具有隔离内存,并与上下文切换共享CPU。
  • 线程划分一个进程。
  • 因此,具有多个控制点的过程是由多个线程实现的。

现在,

什么event loop在一个线程下工作?

如何处理一个线程控制下的不同连接?

更新:

我的意思是如果在一个线程下有3个套接字进行通信,那么1个线程怎样才能与3个套接字进行通信,而不会让任何人等待呢?

基本级的事件循环是这样的:

 while getNextEvent (&event) { dispatchEvent (&event); } 

换句话说,它只不过是一个从一些描述队列中不断检索事件的循环,然后将事件分派给一个事件处理过程。

很可能你已经知道了,但我只是在上下文中解释它。

就不同的服务器如何处理它而言,似乎在Apache中创build的每个新连接都有一个为其创build的线程,并且该线程负责该连接,而不是其他任何东西。

对于另外两个,很可能有一个“设置”数量的线程正在运行(尽pipe这可能实际上会根据负载而变化),并且连接被切换到其中一个线程。 这意味着任何一个线程可能在任何时间点处理多个连接。

所以在这种情况下的事件将不得不包含一些细节,以适用于什么连接,所以线程可以保持不同的连接彼此隔离。

这两个选项毫无疑问是正反两面的。 单线程连接选项可以简化线程函数中的代码,因为它不必处理多个连接,但是随着负载变高,最终可能会导致大量的资源使用。

在multithreading连接的每线程场景中,代码稍微复杂一些,但是通常可以最大限度地减less线程创build和销毁开销,只需要最大数量的线程始终运行。 在高负荷时段之外,他们只是坐在无所事事,等待连接事件给他们。

而且,即使在高负载的情况下,也可能每个线程都可以很容易地处理五个并发连接而不会落后,这意味着单线程每线程选项有点浪费。


根据您的更新:

我的意思是如果在一个线程下有3个套接字进行通信,那么1个线程怎样才能与3个套接字进行通信,而不会让任何人等待呢?

有很多方法可以做到这一点。 一开始,通常都会在getNextEvent()调用后抽象出来,这可能会负责处理所有的连接,并把它们放到正确的线程中。

在最底层,可以通过select调用来完成,这个函数等待多个文件描述符之一的活动,并返回与哪个文件描述符有关的信息。

例如,您提供一个当前打开的套接字的文件描述符集,并通过它来select 。 然后它会给你一个修改后的集合,只包含那些你感兴趣的(比如准备阅读)。

然后,您可以查询该设置并将事件分派给相应的线程。