gpt4 book ai didi

multithreading - Scala actor vs线程和阻塞IO

转载 作者:行者123 更新时间:2023-12-03 13:01:11 25 4
gpt4 key购买 nike

据我了解,actor基本上是在线程之上实现的轻量级线程,可在一个小的共享线程池上运行许多actor。

在这种情况下,在actor中使用阻塞操作会阻塞基础线程。这不是正确性问题,因为actor库将在必要时生成更多线程(是吗?),但是最终您会得到很多线程,这首先抵消了使用actor的好处。

鉴于此,当您需要执行此类IO操作时,参与者如何工作?是否有“ Actor 阻止”操作,在让线程继续进行其他操作的同时挂起actor的操作(就像阻止操作在让CPU继续进行其他操作的同时挂起线程的操作),还是所有以CPS编写的,具有链式关系的操作? Actor ?还是 Actor 根本不适合这种长期运行的行动?

背景:我有使用经典方式编写多线程内容的经验,并且相当了解CPS/事件循环的工作原理,但是绝对没有与 Actor 合作的经验,只是想从高层次上了解它们的适应性,然后再潜水。进入代码。

最佳答案

This is not a correctness problem because the actor library will spawn more threads as necessary (is that right?)



据我了解,那是不对的。 actor被阻止,向其发送另一条消息会使该消息位于actors邮箱中,直到该actor可以对该消息进行 receivereact为止。

在《 Scala编程》(1)中,它明确声明了参与者不应阻塞。如果 Actor 需要长时间运行,则应将工作交给第二位 Actor ,以便主 Actor 可以释放自己的精力,并从其邮箱中读取更多消息。一旦 worker 完成了工作,它就可以将该事实发回给主要 Actor ,后者可以完成任何必须做的事情。

由于工作人员也有邮箱,您最终将需要几个工作人员来忙于整个工作。如果您没有足够的CPU来处理,那么他们的队列就会越来越大。最终,您可以使用远程actor进行横向扩展。在这种情况下, Akka可能更有用。

(1)《 Scala编程的第32.5章》(奥德斯基,第二版,2010年)

编辑:我发现了这一点:

The scheduler method of the Actor trait can be overridden to return a ResizableThreadPoolScheduler, which resizes its thread pool to avoid starvation caused by actors that invoke arbitrary blocking methods.



在以下位置找到它: http://www.scala-lang.org/api/current/scala/actors/Actor.html

因此,这意味着根据您设置的调度程序的隐含性,也许可能会增加用于运行actor的池。当我说您错了时,我错了:-)其余答案仍然成立。

关于multithreading - Scala actor vs线程和阻塞IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8982050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com