I am not sure where to place the blame, but from what I have seen, everything happens sequentially. (one after the other) Although, if coded properly, there should only be 10ms or so between each command sent.
For a silly visualization, imagine I had a room full of people. If I said, “Let’s go to a movie”, they would exit my room in single file. (If they all tried to leave at the same instant, there would be a traffic jam)
Keeping this in mind, I take it even one step farther:
If there are multiple pistons trying to do things at the exact same moment, there is a possibility of commands being ‘lost’ in transit, and never reaching the devices. Because of this, I try to code so no two triggers happens simultaneously, and sometimes even ‘force’ a tiny delay to insure this.
In other words, I value reliability over speed, so I go out of my way to make sure that I do not have multiple commands trying to run simultaneously.
Your mileage may vary.