Остановить serve_forever, когда rospy.is_shutdown

У меня есть следующая программа Python для запуска HTTP-сервера и узла ROS.

httpd = ThreadingHttpServer()

rospy.init_node('server')
rospy.on_shutdown(httpd.shutdown)

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    pass

httpd.server_close()

Я хочу, чтобы программа завершилась

  • когда я вызываю httpd.shutdown() (например, после получения команды /kill),
  • когда ROS закрывается (т.е. если rospy.is_shutdown()) и
  • когда я нажимаю Ctrl+C (это наименее важно).

Каким-то образом я изо всех сил пытаюсь распознать отключение ROS, хотя я пробовал rospy.on_shutdown() и, альтернативно, собственный цикл while, вызывающий httpd.handle_request().

В текущей версии узел (начиная с rosrun) не останавливается при завершении работы roscore.

Как я могу разумно объединить эти два модуля?


person Falko    schedule 24.08.2015    source источник


Ответы (1)


Я считаю, что вы можете остановиться, зарегистрировав функцию закрытия сокета (или свою собственную функцию, которая ее вызывает) в качестве обработчика отключения rospy.

   def shutdown_hook():
       print "Trying to shut down server"
       httpd.shutdown()

   rospy.on_shutdown(shutdown_hook)

Если shutdown() не работает, попробуйте httpd.socket.close()

person Magneon    schedule 15.09.2015
comment
Да, httpd.socket.close() похоже работает в моем случае. Спасибо! :) - person Falko; 15.10.2015