async def _receive_loop(self):
        """Receive the response to a request made to the Watchman service.

        Note that when trying to receive a PDU from the Watchman service,
        we might get a unilateral response to a subscription or log, so these
        are processed and queued up for later retrieval. This function only
        returns when a non-unilateral response is received."""

        try:
            while True:
                response = await self.connection.receive()
                if self._is_unilateral(response):
                    await self._process_unilateral_response(response)
                else:
                    await self.bilateral_response_queue.put(response)
        except Exception as ex:
            await self._broadcast_exception(ex)
            # We may get a cancel exception on close, so don't close again.
            if not self._closed:
                self.close()