问题标签 [actor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Scala 演员作为单线程队列
我想在一个节目中使用演员,在这个节目中,我会对一些演员进行某种限制,就好像他们是队列一样。例如,假设我有一些应用更改事件的外部系统以及一些外部系统数据的缓存。所以我有2个演员:
ChangeApplicationActor
CacheActor
作为 的一部分ChangeApplicationActor
,当我对外部系统中的某个实体应用更改时X
,我想发送一些事件来告诉CacheActor
同步:
但我现在有两个要求:
- 具有
CacheActor
内部状态,理想情况下我希望它Sync
按顺序处理其指令 - 如果我最终在
CacheActor
收件箱中包含两个Sync(x)
相同值的指令x
,那么我想忽略第二个(即Sync
对于任何给定的值,我应该只有一个待处理指令x
)
有没有办法强制一个演员是单线程的?有什么方法可以访问演员的邮箱并删除任何重复的事件?我不能避免实现CacheActor
as, um, not an Actor吗?
scala - Scala Actor 可以同时处理多个消息吗?
对我最近的一个问题的答复表明,一个演员一次处理一条消息。这是真的?我没有看到任何明确说明的内容(在 Scala 编程中),其中包含以下片段(第 593 页)
如果[该
react
方法]找到可以处理的消息,[它]将安排对该消息的处理以供以后执行并抛出异常
(强调我自己的)。两个相关(且相互排斥)的问题:
- 假设一个演员可以同时处理多条消息,我如何强制一个演员一次处理 1 条消息(如果这是我希望做的)?(使用
receive
?) - 假设一个演员一次处理一个消息,我将如何最好地实现一个实际上可以同时处理消息的演员
编辑:做一些测试似乎证明我错了,演员确实是连续的。所以这是我需要回答的问题#2
scala - 在 Scala 中同时处理
正如我自己对自己问题的回答一样,我遇到了一种情况,即我正在处理大量到达队列的事件。每个事件都以完全相同的方式处理,甚至可以独立于所有其他事件进行处理。
我的程序利用了 Scala 并发框架,其中涉及的许多进程都被建模为Actor
s。由于Actor
s 顺序处理他们的消息,因此它们不太适合这个特定问题(即使我的其他参与者正在执行顺序操作)。由于我希望 Scala 能够“控制”所有线程创建(我认为这是它首先具有并发系统的关键),因此我似乎有两个选择:
- 将事件发送到我控制的事件处理器池
- 让我
Actor
通过其他机制同时处理它们
我会认为#1 否定了使用演员子系统的意义:我应该创建多少个处理器演员?是一个明显的问题。据说这些事情对我来说是隐藏的,并由子系统解决。
我的回答是执行以下操作:
有更好的方法吗?这是不正确的吗?
编辑:一个可能更好的方法是:
scala - Scala 的 Actor 框架能否处理 10.000 个 Actor 而没有堆栈问题?
我想使用 Scala Actor 框架进行包含大约 10.000 个代理(机器和产品代理)的多代理模拟。
据我了解,如果有很多参与者传递消息,它会由于递归而耗尽堆栈吗?
如果是这样,我怎样才能增加底层工作线程的堆栈大小?
scala - 我的 Scala 演员的属性是否应该标记为@volatile?
在 Scala 中,如果我有一个简单的类,如下所示:
我的领域sum
应该被标记@volatile
吗?虽然参与者在逻辑上是单线程的(即消息是按顺序处理的),但各个反应可能发生在单独的线程上,因此state
变量可能会在一个线程上被更改,然后从另一个线程读取。
scala - 如何设计时钟驱动的多智能体仿真
我想为真实的制造过程创建一个多智能体模拟模型来评估一些调度规则。仿真需要生成事件日志,以评估调度规则与真实制造事件日志相比的时间效应。
如何将“当前模拟时间”整合到这种多代理、消息传递密集型模拟中?
背景:
经典的离散事件模拟(可以很好地处理时间提前)不能在这里应用,因为系统中的代理代表相对复杂的行为和路由要求,加上调度规则要求它们经常通信。这种和其他过程的复杂性也排除了集中调度方法。
在制造科学中,有数千篇论文使用多智能体模拟来解决一些与制造相关的问题。但是,我还没有找到一篇论文以所需的细节描述这些模拟的内部工作或实现细节。
不幸的是,在系统中使用最短的处理时间进行离散时间步进可能是不可行的,因为处理时间的范围在 0.1 秒到 24 小时之间。我的模拟有可能用于稍后在项目中的假设评估,因此模拟需要尽可能快地运行 - 没有过夜模拟运行的选项。
问题规模约为 500 个资源和 1000 - 10000 个产品代理,其中大部分已完成,不参与任何进一步的通信或资源占用。
因此,作为通信的结果,新事件可以触发代理在其原始“下一次”事件到达之前做某事。例如,代理当前在持续一小时的资源上被阻止。然而,另一个更高优先级的代理立即需要该资源,并要求第一个代理释放该资源。
从某种意义上说,我需要一种方法来创建经典消息传递代理模拟和离散事件模拟的混合体。
我考虑了一个参与每条消息的中介代理 - 一个消息路由器和时间执行器,它围绕消息和计时器滴答事件发送。中介代理还保留各种代理的下一个事件时间列表。但是,我觉得应该有更好的方法来解决我的问题,因为这个概念给调解人带来了巨大的压力。
更新
花了一些时间,但似乎我设法创建了一个迷你框架并将 DES 和代理概念结合在一起。我敢肯定它不是什么新鲜事,但至少是独一无二的:http ://code.google.com/p/tidra-framework/如果您有兴趣。
scala - 向演员发送来自非演员的消息是不好的做法吗?
假设我有一些具有 type 属性actor_
的类Actor
。我这样做有问题吗
或者是否应该始终从另一个参与者发送消息;例如
scala - 如何识别远程参与者?
我有一个远程参与者(客户端)正在向另一个远程参与者(服务器)注册,然后再取消注册(使用关闭挂钩)。但是,虽然服务器拿起了注销,但实际sender
属性是不同的 Channel 对象;所以在我的服务器日志中我有:
Registered new client [scala.actors.Channel@158e282]; supporting 1 clients
De-registered client [scala.actors.Channel@1caf0b6]; supporting 1 clients
我如何确定(在服务器端)这是最初向我注册的同一个客户端参与者?显然我可以为每个客户灌输自己的UUID
,但我想知道是否有更简单的方法?
scala - 如果尝试写入不再存在的客户端,远程参与者框架会做什么?
我有一台服务器,它使用远程参与者框架与多个客户端进行通信。正如这个问题中提到的,我无法跟踪客户何时消失。因此,我的服务器仍在尝试向不存在的客户端发送消息。
- 这是一个问题吗?(我没有看到任何异常被抛出- 但我认为如果我的服务器寿命很长,会有内存问题)
- 如何检测到消息正在发送给不再收听的客户端?(如果我想实现某种连接清理)
scala - Scala 如何为案例类“填充”缺失的参数?
当我打电话时:
如何将其转换为以下结构:
特别是,当我从已被link
编辑到远程(服务器)参与者的远程(客户端)参与者调用它时,服务器如何接收Exit
到from
属性是参与者的实例:
基本上我想弄清楚如何处理这个远程客户端演员对象!