[rclpy] Single(Multi)ThreadedExecutor VS Spin

About_work·2024년 2월 28일
0

ros2

목록 보기
18/41

들어가기 전에

rclpy.spin

  • rclpy.spin(node) 함수는 주어진 노드를 실행하여, ROS 2 시스템에서 이벤트(메시지 수신, 서비스 요청 등)를 처리할 수 있게 합니다.
  • 이 함수는 단일 스레드에서 실행되며, 지정된 노드에 대한 콜백만 처리
  • spin은 실행되는 동안 해당 노드의 콜백을 계속해서 폴링하며, 새로운 이벤트가 발생하면 해당 콜백을 실행합니다.
  • spin은 단순한 사용 사례에 적합하며, 복잡한 멀티태스킹이 필요하지 않은 경우 사용됩니다.

SingleThreadedExecutor

  • SingleThreadedExecutorrclpy.spin과 유사하게 작동하지만, 명시적으로 Executor 인스턴스를 생성하고 관리할 수 있는 더 많은 제어를 제공
  • 이 Executor는 단일 스레드로 운영되어 여러 노드의 콜백을 순차적으로 처리
  • 사용자는 여러 노드를 Executor에 추가할 수 있으며, Executor는 등록된 노드의 콜백을 차례로 실행
  • 복수의 노드를 관리하지만, 멀티스레딩을 필요로 하지 않는 상황에 적합

MultiThreadedExecutor

  • MultiThreadedExecutor여러 스레드를 사용하여 동시에 여러 노드의 콜백을 처리
  • 이는 SingleThreadedExecutor와 비슷하지만, 병렬 실행을 통해 더 높은 처리량과 반응성을 제공
  • 복잡한 애플리케이션에서 여러 노드가 동시에 빠르게 응답해야 하는 경우에 이상적입니다.
  • MultiThreadedExecutor는 사용자가 스레드의 개수를 설정할 수 있어, 자원 사용과 성능 사이의 균형을 맞출 수 있습니다.

비교 요약

  • rclpy.spin은 간단한 사용 사례에 적합하며, 단일 노드의 이벤트를 처리하는 데 사용됩니다.
  • SingleThreadedExecutor는 여러 노드를 관리할 수 있지만, 모든 작업을 단일 스레드에서 순차적으로 처리합니다.
  • MultiThreadedExecutor는 복잡한 애플리케이션에 적합하며, 여러 노드의 이벤트를 동시에 처리할 수 있는 병렬 처리 능력을 제공합니다.

본문

SingleThreadedExecutor

  • SingleThreadedExecutor는 이름에서 알 수 있듯이 단일 스레드에서 콜백을 실행
  • 이는 모든 콜백이 순차적으로 실행됨을 의미하며, 동시성이 필요하지 않은 간단한 어플리케이션에 적합
  • 콜백이 긴 작업을 수행하지 않도록 주의해야 합니다.
  • 그렇지 않으면 다른 콜백의 실행이 지연될 수 있습니다.
import rclpy
from rclpy.executors import SingleThreadedExecutor

def main(args=None):
    rclpy.init(args=args)

    # 노드 생성 및 기타 설정

    executor = SingleThreadedExecutor()
    executor.add_node(your_node)

    try:
        executor.spin()
    finally:
        executor.remove_node(your_node)
        rclpy.shutdown()

MultiThreadedExecutor

  • MultiThreadedExecutor는 여러 스레드에서 콜백을 동시에 실행할 수 있음
  • 이를 통해 높은 수준의 동시성을 달성할 수 있으며, 복잡한 어플리케이션 또는 높은 처리량이 요구되는 시스템에 적합
  • MultiThreadedExecutor를 사용하면 각 콜백이 별도의 스레드에서 실행될 수 있어, 하나의 콜백이 긴 작업을 수행하는 동안 다른 콜백이 대기하지 않고 실행될 수 있습니다.
import rclpy
from rclpy.executors import MultiThreadedExecutor

def main(args=None):
    rclpy.init(args=args)

    # 노드 생성 및 기타 설정

    executor = MultiThreadedExecutor()
    executor.add_node(your_node)

    try:
        executor.spin()
    finally:
        executor.remove_node(your_node)
        rclpy.shutdown()
  • MultiThreadedExecutor의 생성자는 선택적으로 num_threads 인자를 받아 실행에 사용할 스레드의 수를 지정할 수 있습니다. 지정하지 않으면 기본적으로 사용 가능한 CPU 코어 수에 비례하여 스레드 수가 결정됩니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

1개의 댓글

comment-user-thumbnail
2024년 4월 25일

What are the advantages and limitations of using the rclpy.spin() function in ROS 2 for processing events and executing callbacks compared to more complex multitasking approaches?
poppy playtime chapter 3

답글 달기