首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >采用生产者-消费者模式的多代理系统?

采用生产者-消费者模式的多代理系统?
EN

Stack Overflow用户
提问于 2018-06-23 15:42:28
回答 1查看 276关注 0票数 3

我正在尝试实现一个Producer-Consumer模式,它使用多个代理作为工作人员,而不是多线程。

据我所知,典型的多线程实现使用BlockingQueue,其中一个Producer线程将信息放在队列中,让多个Consumer线程拉出数据并执行一些处理功能。

因此,按照相同的逻辑,我的设计将使用一个Producer代理来生成数据并将其发送给多个Consumer代理。乍一看,我认为我应该在代理之间使用一个共享BlockingQueue,并让代理访问队列并检索数据。但我不知道这样做是否容易,因为我认为代理没有任何共享内存,直接将信息作为ACL消息发送到Consumer代理要简单得多。

这一点很重要,因为我的多智能体设计将处理大量的数据。所以我的问题是,在Jade中,如果我向单个代理发送多个ACL消息,会发生什么?代理会忽略其他消息吗?

这个post的答案是"..Within the JADE框架,Agents为ACLMessages提供了一个‘收件箱’,基本上是一个包含接收消息列表的BlockingQueue对象。该代理能够观察自己的列表,并将它们作为生命周期进行处理。容器没有这种功能.“。这句话对吗?如果这是真的,那么其他消息只是在队列上等待,对于我的设计来说,将信息直接发送给Consumer代理是非常理想的,但是我没有在ACLMessage类上看到任何BlockingQueues

EN

回答 1

Stack Overflow用户

发布于 2018-06-23 22:20:41

是的,消息将在队列中,代理不会忽略它们。

ACLMessage只是一个消息对象,它是在代理之间发送的。每个代理都有自己的消息队列(jade.core.MessageQueue)和几种处理通信的方法。

如果您检查Agent类文档,您可以找到以下方法

  • receive() -非阻塞接收,如果队列为空,则返回队列中的第一条消息或null
  • receive(MessageTemplate pattern) --行为与前一个类似,但您也可以为消息指定模式,例如特定的发送方ID、会话ID以及组合。
  • blockingReceive() -阻塞接收,阻塞代理直到消息出现在队列中
  • blockingReceive(MessageTemplate pattern) -阻塞接收,带有模式

还有一些阻止接收的方法,您可以在其中设置超时。

同样重要的是,如果在Behaviour类中定义代理逻辑,也可以只阻塞行为,而不是阻塞整个代理。

代码语言:javascript
复制
ACLMessage msg = agent.receive();    
if (msg != null) {
    // your logic
} else {
    block();            
}

区别在于,内部行为的block()方法只是将您的行为标记为已阻塞,并将其从代理的活动行为池中删除(当收到消息或通过restart()方法重新声明行为时,将其添加回活动池),而blockingReceive()则允许执行其他代理的行为,而blockingReceive()则会完全阻塞您的代理及其所有行为,直到他收到消息为止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51002681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档