No, it will receive up to limit many messages and append them to the buffer, not wait till there are limit many messages to receive:
For limit > 0, if there are no messages in the channel’s queue, but the channel has not yet been closed, this method will sleep until a message is sent or the channel is closed.
This behaviour does not change when used in a select! branch and the method is cancellation safe, so you don't need to worry about messages being dropped if another branch finishes first. The method's return value is the number of received messages 0 <= return value <= limit.
I find the example to be quite helpful. It illustrates the behaviour of recv_many well IMO, although if limit = 2 would've been used in every call to recv_many, I think it would be clearer that the method does not wait till limit many messages are received.
BTW, does recv_many has better performance than recv when there are too many messages pending in channel? i.e. batch processing reduce some contexts switch inside tokio?