Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 为什么一个应用程序中可以有数百万个参与者,但仅仅10000个线程就太多了?_Multithreading_Actor - Fatal编程技术网

Multithreading 为什么一个应用程序中可以有数百万个参与者,但仅仅10000个线程就太多了?

Multithreading 为什么一个应用程序中可以有数百万个参与者,但仅仅10000个线程就太多了?,multithreading,actor,Multithreading,Actor,为什么一个应用程序中可以有数百万个参与者,但仅仅10000个线程就太多了?为什么创造数以百万计的演员是可行的,而不是几个线程?线程能做什么,actors不能做什么(否则我们会一直使用actors!)?假设Scala和JVM: 每个线程为其堆栈保留一定数量的内存: java -v -Xss<size> set java thread stack size java-v -Xss设置java线程堆栈大小 因此,创建多个线程将消耗您的内存 另一方面,多个参与者可以共享同一

为什么一个应用程序中可以有数百万个参与者,但仅仅10000个线程就太多了?为什么创造数以百万计的演员是可行的,而不是几个线程?线程能做什么,actors不能做什么(否则我们会一直使用actors!)?

假设Scala和JVM:

每个线程为其堆栈保留一定数量的内存:

java -v
-Xss<size>        set java thread stack size
java-v
-Xss设置java线程堆栈大小
因此,创建多个线程将消耗您的内存

另一方面,多个参与者可以共享同一个堆栈,从而大大减少了内存消耗

一个应用程序中通常可以有10000个线程。据我所知,没有任何限制可以阻止你

另一方面,由于很少有现代台式机有10000个处理器,这不太可能是个好主意


当你说“演员”时,你指的是什么?如果是的话,这是一个苹果对桔子的比较;线程是一条实际运行的执行路径,参与者更接近于闭包。一个线程已经分配了与之相关的资源(至少对于绿色线程来说是一个指令指针位置,对于内核线程来说更是如此)。参与者可以非常小。

参与者模型不会隐式地扩展到数百万参与者。这是实现的一个细节。例如,来自:

“当参与者调用线程阻塞时 操作,例如接收(或甚至接收) 等待),正在运行的工作线程 执行当前参与者(自身)是 阻塞。这基本上意味着 演员被表示为一个被阻止的角色 线程。取决于线程的数量 你想要使用的演员,你可能想要 为了避免这种情况,因为大多数JVM无法 处理几千个以上 标准硬件上的线程。”

因此,可以使用与线程相同的限制实现参与者(或者在病态实现中实现更糟糕的限制)

同样,线程是一个抽象概念,没有具体的资源需求。您的10000个线程限制是针对特定的实现(可能是内核级别的Windows线程或pthreads),而不是一般的线程。事实上,目前正在进行研究,以构建可扩展到数百万个线程的用户级线程。见:

消息传递和参与者是管理并发性的好方法,但它们不是唯一的方法。在你切换到仅限演员之前,请阅读他为什么不在Clojure中包括演员


是管理可变共享状态的另一种选择。

参与者和线程不是同一种对象。
*线程是计算机上的实际对象—它消耗可预测的资源量,并具有与之相关的精确开销。因此,如果您通过给每个任务一个线程来描述1000000个任务,那么您明确要求您的机器提供1000000倍于一个线程的资源。
*参与者更像是向您的语言解释任务单元的一种方式,因此它在运行时没有精确的图像。您的编译器在使用其认为适合的资源来完成您描述的任务方面有更多的自由

线程的数量是有限的,因为它们确实以精确定义的方式消耗资源。它们会消耗内存,而切换到另一个线程是有代价的。超过一定数量的线程后,您将耗尽机器的内存,或者调度成本将主导您的程序执行。这是使用多个线程将达到的限制。就所有实际用途而言,在今天的硬件上,10000个线程是很多的

但是actors允许您以编程语言更容易理解的方式解释您想要做什么。因此,它可以以更高效的方式管理资源,因此,如果您与参与者一起描述1000000个任务,那么环境就有更好的机会找到编译和运行它的方法,以便它仍然是可管理的。关于线程,最大的区别来自这样一个事实:当参与者描述一个非常不同的处理时,他们可以在任何线程上运行,允许使用任意大小的线程池来处理到达的请求。您不会将编译器锁定在一个会破坏其性能的方案中:它知道它不能生成1000000个线程,所以它会尝试以另一种方式完成它,并且通常会成功。决定线程数量的自由度允许进行大量优化,第一种优化使用尽可能多的线程以及机器上的内核/CPU,从而产生最佳计算速度。这样的设计对于死锁问题也更有弹性,因为您不直接处理计时和锁定

至于线程可以做什么,而不是参与者,没有太多,但是线程更接近于表示机器中实际发生的事情,您可以更紧密地控制实际发生的事情。因此,从理论上讲,使用线程可以获得更高的性能,但实际上,使用线程可以击败配备了角色的优秀编译器,这几乎是不可能的,因为模型更难使用,而且编译器知道太多你不可能知道的事情。
另一件事,尽管不是理论上的限制,线程使之成为可能,而且参与者不会很擅长,就是处理使用线程的库。事实上,线程是许多环境的基本模型,您有许多库需要以特定的方式使用它们。演员在这方面可能不是很有能力。
我仍然可以想到线程可以做而不是参与者的另一件事:实时(我指的是硬实时,比如微秒级的截止时间、纳秒级的抖动、代码验证和硬保证)。我认为可以使用actor模型进行实时操作,但据我所知,目前还没有这样的实现,因此在此之前,您必须严格使用线程进行硬实时操作