我正在尝试实现一种使用多代理作为工作线程而不是多线程的Producer-Consumer
模式。
据我了解,典型的多线程实现使用一个BlockingQueue
,其中一个Producer
线程将信息放在队列上,并让多个Consumer
线程拉取数据并执行一些处理功能。
因此,遵循相同的逻辑,我的设计将使用生成数据并将其发送到多个Consumer
代理的Producer
代理。乍一看,我认为我应该在Consumer
代理之间使用共享BlockingQueue
,并让代理访问队列并检索数据。但我不知道这是否容易做到,因为我认为代理没有任何共享内存,将信息作为 ACL 消息直接发送到Consumer
代理要简单得多。
这一点很重要,因为我的多智能体设计将处理大量数据。所以我的问题是,在 Jade 中,如果我向单个代理发送许多 ACL 消息会发生什么?代理是否会忽略其他消息?
这篇文章有一个答案,建议"..在JADE框架中,代理具有ACLMessages的"收件箱",基本上是一个包含已接收消息列表的BlockingQueue对象。代理能够观察自己的列表,并在生命周期进行时处理它们。容器不具有此功能..."。这种说法正确吗?如果这是真的,那么其他消息只是在队列中等待,对于我的设计来说,将信息直接发送到Consumer
代理将是理想的选择,但我在 ACLMessage 类上没有看到任何BlockingQueues
。
是的,消息将在队列中,代理不会忽略它们。
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()
完全阻止您的代理和他的所有行为,直到他收到消息。