我正在关注this thread中的示例,尝试将消息发布到远程VOLTTRON平台,并且在远程平台正常运行和设置时工作正常。 但是,当远程平台未运行时,发布功能将永远保持阻塞状态,并且不会超时。这可以防止检测到远程平台何时未运行,并且还可以防止执行其余的远程平台。代码。
from volttron.platform.vip.agent import Core, Agent
import gevent
def vip_publish(topic,message, address=None):
retry = 3
while retry>0:
pub_agent = Agent(address=address)
my_event = gevent.event.Event()
pub_agent.core.onstart.connect(lambda *a, **kw: my_event.set(),my_event)
agent_thread = gevent.spawn(pub_agent.core.run)
my_event.wait()
try:
#The following line remains blocking forever when remote volttron platform is not running
pub_agent.vip.pubsub.publish(peer='pubsub', topic=topic, message=message).get(timeout=1)
except gevent.Timeout:
print "Time-out"
retry -= 1
else:
retry = 0
agent_thread.kill()
答案 0 :(得分:0)
回答vip.pubsub.publish method does not timeout这个问题。
此代理的代码不正确。 my_event.wait()不会抛出异常,而是返回true或false值。
所以代码应该是这样的:
if not my_event.wait(timeout=5):
print('Bad thing here')
sys.exit()
或者您可以使用
with gevent.Timeout(timeout=5):
event.wait() # note not gevent
请参阅https://github.com/VOLTTRON/volttron/blob/develop/volttron/platform/vip/agent/utils.py,了解我们如何处理此事。