A sequence uses the start_item() call to tell the sequencer that it is ready to generate/send a sequence item. The call is blocking until the sequencer is ready to receive the item. The sequence will then call finish_item() to pass the sequence_item to the sequencer. This call is also blocking and will return when the driver has finished processing the item. This flow ensures that all sequence_items generated by the sequence have been processed by the driver, and the start() call to the sequence will only return when the body() task completes. There is no queue in the sequence, as each sequence_item is generated between start_item() and finish_item().
This post dicusses a common mechanism used by the scoreboard to delay the end of a phase based on queues which aren’t empty.