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

时间:2018-06-23 15:42:29

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

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

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

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

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

post的答案建议为“。在JADE框架中,代理具有ACLMessages的“收件箱”,基本上是一个BlockingQueue对象,其中包含收到的消息列表。观察自己的列表并将其作为生命周期进行处理。容器不具备此功能...” 。那句话正确吗?如果是这样,则其他消息仅在队列中等待,这对我的设计来说是将信息直接发送到Consumer代理的理想选择,但是我没有看到BlockingQueues上的任何消息。 ACLMessage类。

1 个答案:

答案 0 :(得分:2)

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

... >> let inputPipe = Pipe() >> task.standardInput = inputPipe task.launch() >> inputPipe.fileHandleForWriting.write("text to send to java program".data(using: String.Encoding.utf8) ... 只是一个消息对象,在代理之间发送。每个代理都有自己的消息队列(ACLMessage)和几种处理通信的方法。

如果您查看jade.core.MessageQueue类文档,则可以找到类似的方法

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

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

值得一提的是,如果您在blockingReceive(MessageTemplate pattern)类中定义代理逻辑,则也可以仅阻止行为,而不是阻止整个代理。

Behaviour

区别在于,行为内部的ACLMessage msg = agent.receive(); if (msg != null) { // your logic } else { block(); } 方法只是将您的行为标记为已阻止,并将其从代理的活动行为池中删除(当收到消息或行为被{{1 }}方法)允许执行其他座席的行为,block()会完全阻止您的座席及其所有行为,直到他收到消息为止。