3

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

据我了解,典型的多线程实现使用BlockingQueue一个Producer线程将信息放在队列上,并让多个Consumer线程提取数据并执行一些处理功能。

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

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

这篇文章有一个答案建议“..在 JADE 框架内,代理具有 ACLMessages 的'收件箱',基本上是一个 BlockingQueue 对象,其中包含收到的消息列表。代理能够观察自己的列表并将它们视为自己的生命周期继续进行。容器不具备这种能力……”。这种说法正确吗?如果这是真的,那么其他消息只是在队列中等待,我的设计将信息直接发送到代理将是理想的,但我在 ACLMessage 类上Consumer没有看到任何消息。BlockingQueues

4

1 回答 1

1

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

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

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

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

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

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

ACLMessage msg = agent.receive();    
if (msg != null) {
    // your logic
} else {
    block();            
}

不同之处在于,block()行为内部的方法只是将您的行为标记为被阻止并将其从代理的活动行为池中删除(它添加回活动池,当接收到消息或行为被restart()方法重新启动时)允许执行其他代理的行为,并blockingReceive()阻止完全是你的代理人和他的所有行为,直到他收到消息。

于 2018-06-23T22:20:41.760 回答