Fix MultiThreadedExecutor spinning (backport #315) #321
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I noticed that the MultiThreadedExecutor was not operating in a multi-threaded manner, so I made some changes.
From my review of the rclcpp code, it appears that the current rclcpp::MultiThreadedExecutor only implements spin(), and spin_once() and spin_some() simply execute the implementation from the base class rclcpp::Executor.
Implementation of MultiThreadedExecutor::spin():
Even after checking the implementation of rclcpp::Executor, I found no instances where the overridden spin is utilized. As a result, spin_once() and spin_some() seem to operate in a single-threaded mode. Indeed, in the header file of rclcpp::Executor, spin_some() and spin_once() are described as "suitable for a single-threaded model of execution."
Additionally, similar observations were made in a related pull request for rclcpp.
ros2/rclcpp#2454
There was also an old issue related to this problem, but it seems to have been closed without appropriate changes.
ros2/rclcpp#85
Therefore, in this pull request, I changed the implementation to use spin() instead of spin_once() for MultiThreadedExecutor. Consequently, the stop_ flag became unnecessary and was removed. It has been confirmed that the spin thread terminates correctly with executor_->cancel(), without using the stop_ flag.
As a side note, I would like to mention that MultiThreadedExecutor::spin() is also used in the ros2_control_node.
This is an automatic backport of pull request #315 done by Mergify.