'Go through the list of requests and process the completed ones.
We take a snapshot in time of all requests and responses for this flow. We
then process as many completed requests as possible. If responses are not
quite here we leave it for next time.
It is safe to call this function as many times as needed. NOTE: We assume
that the flow queue is locked so another worker is not processing these
messages while we are. It is safe to insert new messages to the flow:state
queue.
Args:
notification: The notification object that triggered this processing.'

def ProcessCompletedRequests(self, notification, unused_thread_pool=None):

    self.ScheduleKillNotification()
    try:
        self._ProcessCompletedRequests(notification)
    finally:
        self.FinalizeProcessCompletedRequests(notification)
