正如标题所说的,这篇帖子主要说下,在解决这个问题的时候所遇到的问题
先说下背景:
1,一个请求,启动多个actor去执行任务,当任务执行过程中,又请求的一次,进行了重复请求
这种情况下,会出现异常InvalidActorNameException,也就是说actor的名字重复了
首先想到将正在执行的actor关闭,actor的关闭我这里说一种,actorSysm.stop(actor);
actorSystem类型是ActorSystem,如果不知道这个是怎么来的,去搜索下怎么创建actor,自然就有了
但是这里有个问题,stop的命令不会立即终止actor,不像linux的kill一样,直接杀死,而是要发送让其
死亡的消息,但是我们不可能等到这个actor彻底死了,才去创建新的actor
这期间试了几种方法,都不能满足需求
最后,只能曲线救国
那就是每次请求进来,重新建立actorSystem
ActorSystem systemo = system.apply("AkkaVehicleReport");
然后将之前的actorSystem关闭
system.shutdown();
最后将之前的actorSystem的引用指向新建的actorSystem
system = systemo;
这样做的效果就是每次都是新的actorSystem去创建actor执行任务,不会出现名字重复的问题
同时关闭了之前的actorSystem,之前创建的actor会逐层被杀死,解决了不会因为重复提交而造成
一直创建actor的问题,
因为我的actor执行的完成之后会将数据保存到一个地方,这么操作还有一个意外收获
那就是之前的actor未被杀死之前执行完的数据会被保存下来,新建的actor不需要再次执行
提高了数据利用率
下面把相对完整的代码贴出来,欢迎大家指导
注入部分:
@Autowired
private ActorSystem system;
这里说下,如果你无法注入这个actorSystem,需要增加一部分代码,这里不做解释,可以自己搜下,找不到可以找我-469798404
方法内部:
ActorSystem systemo = system.apply("AkkaVehicleReport");
system.shutdown();
system = systemo;
for (int i = 1; i <= 20; i++) { ReportMessage msg = new ReportMessage(); String actorName = session.getId() + "pageActor" + i; try { actorList.add(actorName); ActorRef pageActor = system.actorOf(SpringExtProvider.get(system).props(PageActor.class), actorName); System.out.println("---" + actorName + "-----------create"); pageActor.tell(msg, ActorRef.noSender()); } catch (InvalidActorNameException e) { e.printStackTrace(); } }
创建了20个actor,去执行任务
@Override public void onReceive(Object msg) throws Exception { if(msg instanceof ReportMessage){ //查询数据,处理数据 ReportMessage remsg = (ReportMessage)msg; //判断该部分数据是否处理完成 if(//处理完成){ System.out.println("----------重复---done---" + this.self().path().name()); }else{//未处理完成 //重新处理 System.out.println("-------------done---" + this.self().path().name()); } getContext().stop(this.getSelf()); } else{ unhandled(msg); } }
整体的结构就是这样,删掉了一些业务代码
整体思路就是这样
重复提交时,创建actor的动作和停止正在执行的actor的动作时同时操作的,这样又可以节省一部分时间
只是可能要多消耗一些性能
相关推荐
除非为了在Actor Core.vi的中不断监视或输送某些值,当然此时就需要解决如何在适当时刻停止while循环的问题了。本例中未予以演示,但可以从本例的全局变量的g_bool中得到参考,while循环到底应该在何时被结束。
Actor模型的核心思想是将并发处理中的实体——也就是执行单元——抽象为“Actor”,每个Actor都有自己的状态,并且通过异步消息传递与其他Actor进行通信。这种模型特别适合于多核处理器和分布式系统,因为它能够有效...
这种类型的actor适合于网络I/O或者其他I/O密集型任务,因为它们能够在等待I/O完成时执行其他工作。 相比之下,blocking_actors更适合于计算密集型任务,或者对实时响应时间要求不高的场景。它们简化了编程模型,...
Actor Framework利用LabVIEW的并行执行能力,使得多个actor可以同时运行。同步机制,如信号量和条件变量,用于控制actor间的协作,确保正确的时间顺序和资源访问。 6. **错误处理和调试** 考虑到系统的复杂性,...
在这个模型中,每个Actor都是一个独立的执行单元,拥有自己的状态,并通过消息传递与其他Actor进行通信。这种模型能够有效避免竞态条件和死锁,简化了并发编程的复杂性。 Clooney库的实现基于JavaScript,这意味着...
当一个Actor接收到消息时,它会在自己的上下文中执行,不会阻塞其他Actor的执行。这种并行处理方式使得系统能够高效地处理大量并发请求。此外,由于Actor之间的通信是异步的,所以它们可以独立工作,即使在处理时间...
在`Actor`模式中,每个`Actor`都是一个独立的执行单元,拥有自己的状态和邮箱,通过发送消息来进行通信。当`Actor`接收到消息时,它会在内部处理这些消息,而不会阻塞其他`Actor`的执行。这种方式提供了天然的线程...
每个Actor都有自己的状态,并且只能通过发送消息来与其他Actor通信,这确保了并发执行时的线程安全。在Swift中,Aerojet实现了这一模型,允许开发者编写更加安全、高效的并发代码。 在Aerojet中,Actor是一种特殊的...
反射机制使得在运行时能够动态地访问和操作对象的属性和方法,这对于动态加载和序列化非常关键。垃圾回收确保了不再使用的对象会被自动释放,防止内存泄漏。序列化则允许将游戏状态保存和加载,而编辑器可见性和默认...
其中θ是Actor网络的参数,J(θ)是策略的预期回报,Q(s, πθ(s))是Critic网络预测的在状态s下执行策略πθ(s)的动作的价值。 **Critic的更新** Critic网络通过最小化其预测Q值与目标Q值之间的差距来更新。目标Q值...
- 选择动作:根据当前状态,通过Actor网络得到动作概率分布,然后随机采样一个动作执行。 - 执行动作并观察结果:环境根据上一步的动作给出新状态和奖励。 - 更新Critic:根据新的状态和奖励,以及旧的状态,计算...
Critic Network则是价值函数的近似,它估计给定状态下执行某个动作后的累积奖励。Critic Network的训练通常基于梯度上升,通过最小化预测值与实际回报的误差来优化。 "monthhu7"可能是一个特定的研究者或者项目的...
3. SBT的使用:如何配置SBT构建文件,以及如何通过SBT命令管理项目依赖和执行构建过程。 4. Akka的并发模型:了解Actor模型如何解决并发问题,以及如何通过Actor的隔离性保证数据一致性。 5. 测试Actor系统:学习...
2. **并行性**:由于actor是独立运行的,因此可以在多核或多处理器系统上并行执行,提高程序性能。 3. **异步性**:消息传递是异步的,接收消息的actor可以在合适的时候处理,发送消息的actor无需等待响应,这有助于...
多线程、Actor模型、协程和进程是实现并行计算的四种常见方式。 一、多线程(Multi-Threading) 多线程是并发编程的基础,允许一个应用程序同时执行多个任务。在Java、C#等语言中,多线程通过创建和管理线程来实现...
1.0-RC2版本提供了一套完善的部署API,可以控制Actor的执行环境,如内存空间、线程池等,以适应不同的性能需求。 7. jar包依赖 `akka-typed-actor-1.0-RC2.jar`是Akka Typed Actor的特定版本库,包含了该版本的...
Akka的Actor模型还支持分布式部署,这意味着Actor可以跨多个节点运行,进一步增强了系统的可扩展性。通过Akka的Remoting功能,Actor可以相互通信,即使它们位于不同的网络或服务器上。这对于构建云原生应用或者...
如果一个Actor发生异常,它会接收到一个`Terminated`消息,然后可以选择重启或停止。此外,可以通过设置`supervisorStrategy`来定义父Actor如何处理子Actor的故障。 **Actor的层级结构** Actors可以形成一个树状...