Функция публикации VIP не рассчитана, когда удаленная платформа не работает

Я следую примеру в этой теме, чтобы попытаться опубликовать сообщения на удаленной платформе 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()

1 ответ

В ответ на vip.pubsub.publish метод также не останавливает этот вопрос.

Код этого агента неверен. 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 чтобы узнать, как мы с этим справляемся.

Другие вопросы по тегам