The methods isend and irecv return communication request objects. A set of these request objects can then be passed to the waitany method, which waits until one of them completes. In principle any number of user threads are allowed (but we assume that a particular request object will not appear concurrently in waitany calls being executed in different threads).