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

标签 java multithreading producer-consumer agents-jade multi-agent

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

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

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

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

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

最佳答案

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

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() 方法只是将您的行为标记为已阻止,并将其从代理的 Activity 行为池中删除(它添加回 Activity 池,当收到消息或行为是通过 restart() 方法重新启动)允许执行其他代理的行为,并且 blockingReceive() 完全阻止您的代理及其所有行为,直到他收到消息。

关于java - 使用生产者-消费者模式的多代理系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51002681/

相关文章:

java - OpenCL 内核比普通 Java 循环慢

Java 小程序在 Java 8u60 下的 Internet Explorer 中不再起作用

java - 最小化 JDK8 ConcurrentHashMap 检查和设置操作的锁定范围

multithreading - 多线程代码中 QSerialPort 的 Qt 错误:QCoreApplication::sendEvent:“无法将事件发送到不同线程拥有的对象

c++ - 有没有办法标记不可重入 C 库调用的使用?

.NET - 使用 .NET react 的多线程生产者消费者

C - 当生产者大于缓冲区大小时,消费者/生产者出现死锁

java - 弱引用字符串和字符串常量

c++ - 多生产者单消费者 - 段错误

c# - 使用 C# 的快速快捷方式放置变量