gpt4 book ai didi

multithreading - 了解scala中actor的线程性

转载 作者:行者123 更新时间:2023-12-04 13:20:23 25 4
gpt4 key购买 nike

有人告诉我,(Scala)Actor实际上从不会同时执行两个操作,这表明act(或react?或receive?)方法本质上是同步的。我知道在act方法中进行长时间操作会导致阻塞问题,并且我认为必须以某种方式同步对消息队列的访问...但是...

所建议的是,参与者收到告诉其增加内部计数器的消息的参与者将以线程安全的方式增加该计数器。不会同时处理两个更新消息,因此不会有两个消息可以尝试同时更新计数器。

actor中的counter属性听起来像“共享状态”。

这样的操作是完全线程安全的,这真的是真的吗?如果是这样,一个参与者如何以某种有效的方式利用多个核心机器? Actor 如何多线程化?

如果不是,什么是合适的惯用方式以线程安全的方式对消息进行计数而又不需要一些同步/易变的变量?

最佳答案

Actor模型可用于将可变状态与外界隔离。当您具有可变状态(例如,分配给多个并发进程的ID的全局注册表)时,可以将该可变状态包装在Actor中,并使客户端通过消息传递与Actor通信。这样,只有参与者直接访问可变状态,并且正如您所说的,客户端消息排队等待被逐一读取和处理。消息不可变是很重要的。

为了避免队列已满,重要的是消息处理(reactreceive等)应尽可能短。长期运行的任务应移交给其他参与者:

1.  Actor A receives a message M from sender S
2. A spawns a new actor C
3. A sends (S, f(M)) to C
4. In parallel:
4a. A starts processing the next message.
4b. C does the long-running or dangerous (IO) task,
When finished, sends the result to S,
and C terminates.

此过程中的一些替代方法:
  • C将(S, result)发送回A,后者又转发给S
  • A保留一个映射ActorRef C => (Sender S, Message M) so in case it sees C fail,它可以使用新的Actor重试处理M。

  • 因此,总而言之,Actor是多线程的,以便多个客户端可以从各个线程向它发送多个消息,并且可以确保Actor将串行处理所有这些消息(尽管顺序可能会受到各种不同程度的限制)。严格的限制)。

    请注意,虽然Actor的 react代码 may be executed on various threads,在单个给定的时间点,它仅在单个给定的线程上执行(您可以想象Actor在调度程序认为合适的情况下从一个线程跳到另一个线程,但这是技术细节)。注意:内部状态仍然不需要同步,因为Actors在处理消息之间为 guarantee happens-before semantics

    通过使多个Actor并行工作(通常形成 supervisor hierarchiesbalancing workload)来实现并行。

    请注意,如果您需要的只是并发/异步计算,但您没有或可以摆脱全局状态, Future s are a better composing和更简单的概念。

    关于multithreading - 了解scala中actor的线程性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399414/

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