3

据说 Node(以及可能的 twisted 等)相对于更传统的线程服务器的主要优点之一是事件循环模型支持的非常高的并发性。最大的原因是每个线程都有很高的内存占用,并且交换上下文相对昂贵。当您有数千个线程时,服务器大部分时间都在线程之间交换。

我的问题是,为什么操作系统或底层硬件不支持更轻量级的线程?如果他们这样做了,你能用普通线程解决 10k 问题吗?如果他们不能,那是为什么呢?

4

2 回答 2

3

现代操作系统可以支持大量线程的执行。

更一般地说,硬件变得越来越快(最近,它以一种对多线程和多处理比对单线程事件循环更友好的方式变得越来越快 - 即增加内核数量,而不是增加处理吞吐量能力)单核)。如果你今天买不起线程的开销,明天你可能买得起。

Twisted(可能还有 Node.js 等人)的协作多任务系统比抢占式多线程(至少以 pthreads 的形式)提供的东西是易于编程。

正确使用多线程比正确使用单线程要小心得多。事件循环只是在不超出单个线程的情况下完成多件事的方法。

考虑到并行硬件的普及,多线程或多处理更容易实现(并且更容易正确实现)将是理想的选择。Actors,消息传递,甚至可能是 Petri 网是人们试图解决这个问题的一些解决方案。与主流的多线程方法(pthreads)相比,它们仍然非常边缘化。另一种方法是 SEDA,它使用多个线程来运行多个事件循环。这也没有流行起来。

所以,使用事件循环的人可能认为程序员的时间比 CPU 时间更有价值,而使用 pthreads 的人可能会做出相反的决定,而探索演员之类的人会更重视这两种时间(显然疯了,这可能就是为什么没人听他们的)。

于 2011-10-06T21:20:28.330 回答
0

问题实际上并不在于线程的重量级,而是要编写正确的多线程代码,您需要锁定共享项,这会阻止它随着线程数量的增加而扩展,因为线程最终会等待彼此获得锁,而您快速达到添加额外线程没有效果​​甚至减慢系统速度的地步,因为您获得更多锁争用。

在许多情况下,您可以避免锁定,但很难做到正确,有时您只需要一个锁定。

因此,如果您仅限于少量线程,您可能会发现完全消除必须锁定资源的开销,甚至考虑一下,无论您使用多少线程,单线程程序都比多线程程序更快添加。

基本上锁可能(取决于您的程序)非常昂贵,并且可以阻止您的程序扩展到几个线程之外。而且您几乎总是需要锁定某些东西

问题不是线程的开销,而是线程之间的同步。即使您可以立即在线程之间切换,并且拥有无限的内存,如果每个线程最终都在队列中等待它轮到某个共享资源,这也无济于事。

于 2011-10-06T22:07:49.500 回答