问题标签 [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.
java - 我应该使用 Java 中的哪个 ThreadPool?
有大量的任务。每个任务都属于一个组。要求是每组任务应该像在单个线程中执行一样串行执行,并且应该在多核(或多cpu)环境中最大化吞吐量。注意:还有大量与任务数量成正比的组。
天真的解决方案是使用 ThreadPoolExecutor 并同步(或锁定)。但是,线程会相互阻塞,吞吐量不会最大化。
有更好的主意吗?或者是否存在满足要求的第三方库?
scala - 如何让 scala 演员“等待信号”但不丢失任何消息?
我试图让一个演员“去睡觉”,等待另一个演员发出信号。我想做类似的事情:
现在,当我的演员睡觉时,其他消息会发生什么?他们会被分道扬镳吗?我不想失去他们。什么是解决这个问题的好方法?
scala - 具有守护进程式语义的演员
Scala 2.8 昨天发布。他们突出强调“增强型演员”。
“具有守护进程式语义的参与者”是什么意思,我在哪里可以找到更多相关信息?
scala - Clojure 的代理与 Scala 的演员相比如何?
我在 Scala(这里的源代码)(Scala 2.8 RC7)和 Clojure(这里的源代码)(Clojure 1.1)中编写了一个环形网络拓扑的模拟,用于比较 Actor 和 Agent。
当我将网络中的节点数量从 100 增加到 1000000 时,Scala 版本显示几乎恒定的消息交换率,而 Clojure 版本显示消息交换率随着节点数量的增加而降低。同样在单次运行期间,Clojure 版本中的消息速率会随着时间的推移而降低。
所以我很好奇 Scala 的 Actor 与 Clojure 的 Agent 相比如何?代理是否天生就比 Actor 的并发性低,或者代码编写效率低(自动装箱?)?
PS:我注意到 Scala 版本中的内存使用量随着节点数量的增加而增加很多(100 万个节点 > 500 MB),而 Clojure 版本使用的内存要少得多(100 万个节点约 100 MB)。
编辑:
这两个版本都在同一个 JVM 上运行,所有 JVM 参数以及 Actor 和 Agent 配置参数都设置为默认值。在我的机器上,Scala 版本始终为 100 到 100 万个节点提供大约 5000 条消息/秒的消息速率,而 Clojure 版本从 100 个节点的 60000 条消息/秒开始,对于 100 万个节点降低到 200 条消息/秒。
编辑 2
原来我的 Clojure 版本写得很低效。我将nodes
集合的类型从更改list
为vector
,现在它显示了一致的行为:100 个节点为 100000 消息/秒,100000 个节点为 80000 消息/秒。所以 Clojure 代理似乎比 Scala Actors 更快。我也更新了链接的来源。
scala - RemoteActor 注销演员
我在玩 RemoteActors。现在我想知道,如果我关闭 RemoteActor 会发生什么。演员通过 RemoteActor.alive 和 RemoteActor.register 可用。我找不到两者的倒数:活着和注册。
如何正确关闭 RemoteActor?
更新
为了让它更明显,我做了一个“小”的例子。以下 2 个程序均未终止,JVM 继续运行。所有用户创建的演员和主要演员都已完成。
A 的输出为:
对于 B 是:
调试器对 A Program 说,以下 4 个非守护线程仍在运行:
- PlainSocketImpl.socketAccept
- SocketInputStream.socketRead0
- ForkJoinScheduler.liftedTree1
- 销毁JavaVM
scala - RemoteActor.select - 结果确定性?
我想知道调用 val delegate = RemoteActor.select() 时是否有任何确定性。我问这个,因为我注意到当我通过网络发送代表时程序没有终止。
是否有任何其他副作用,取决于委托?
当 RemoteActor.select 将为相同的参数返回相同的委托时,是否有任何规则?
下面是一些演示 RemoteActor.select 问题的示例代码:
scala - Scala Remote Actors - 陷阱
在编写 Scala RemoteActor 代码时,我注意到了一些陷阱:
- 必须设置 RemoteActor.classLoader = getClass().getClassLoader() 以避免“java.lang.ClassNotFoundException”
- 由于“支持远程参与者的 NetKernel(负责远程转发消息的设施)可以在远程参与者的代理(更具体地说,代理委托)有机会发送之前关闭的竞争条件,链接并不总是有效远程指示本地出口的消息。” (斯蒂芬·图)
- RemoteActor.select 并不总是返回相同的委托(RemoteActor.select - 结果确定性?)
- 通过网络发送委托会阻止应用程序正常退出(RemoteActor unregister actor)
- 如果 RemoteActor.alive() 和 RemoteActor.register() 在动作之外使用,远程 Actor 不会终止。(见马格努斯的回答)
程序员还应该注意其他陷阱吗?
scala - 如何用支持演员模型的语言实现“成为”?
Gul Agha 在他的技术报告“Actor:分布式系统中的并发计算模型”中很好地描述了 Actor 模型。
在第 49 页,他解释了“成为”命令:
调用“成为 X”后,演员会将他所有的消息转发到另一个演员的邮箱 (X)。
但是,我不确定这是如何在 Erlang 和 Scala 等语言中实现的(它是如何实现的)。我必须手动编码吗?效率呢?Agha 展示了使用消息传递的堆栈实现。每次执行pop或push时,都会向某个actor添加一个转发链接......经过数十万次操作后,我希望这样的实现会花费太多时间转发消息而不做实际工作,除非有些在引擎盖下进行了很好的优化。
所以我的问题是:转发(或“成为”)是如何在典型的参与者语言中实现的,比如 Erlang、Scala(以及其他语言的库)?
scala - 如何杀死 RemoteActor?
不确定我是否遗漏了什么。使演员远程时,主要方法不会终止。
这是一个演示问题的片段。
scala - 使用 scala 演员时我应该如何处理阻塞操作?
大约两天前,我开始学习 scala actor 框架。为了使我的想法具体化,我决定实现一个基于 TCP 的回显服务器,它可以处理多个同时连接。
这是回显服务器的代码(不包括错误处理):
基本上,服务器是一个处理“已连接”和“已断开”消息的 Actor。它将连接委托给匿名参与者,该参与者调用 serverSocket上的accept()方法(阻塞操作)。当连接到达时,它通过“已连接”消息通知服务器,并将套接字传递给它以用于与新连接的客户端通信。ConnectionHandler类的一个实例处理与客户端的实际通信。
这是连接处理程序的代码(包括一些错误处理):
连接处理程序使用匿名参与者,通过在套接字的输入流上调用readLine()方法(阻塞操作)来等待将请求发送到套接字。当收到请求时,会向处理程序发送“请求”消息,然后处理程序将请求回显给客户端。如果处理程序或匿名参与者遇到了底层套接字的问题,则套接字将关闭,并向回显服务器发送“断开连接”消息,指示客户端已与服务器断开连接。
所以,我可以启动 echo 服务器并让它等待连接。然后我可以打开一个新终端并通过 telnet 连接到服务器。我可以向它发送请求,它会正确响应。现在,如果我打开另一个终端并连接到服务器,服务器会注册连接,但无法为这个新连接启动连接处理程序。当我通过任何现有连接向它发送消息时,我没有立即得到响应。这是有趣的部分。当我终止除一个现有客户端连接之外的所有客户端连接并使客户端 X 保持打开状态时,将返回对我通过客户端 X 发送的请求的所有响应。我做了一些测试并得出结论,即使我调用start() ,后续客户端连接也不会调用act()方法创建连接处理程序的方法。
我想我在连接处理程序中错误地处理了阻塞操作。由于先前的连接是由一个连接处理程序处理的,该连接处理程序阻止了一个匿名参与者等待请求,我认为这个被阻止的参与者正在阻止其他参与者(连接处理程序)启动。
使用 scala 演员时我应该如何处理阻塞操作?
任何帮助将不胜感激。