<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def call_rpc_external(self, address, rpc_id, arg_payload, timeout=10.0):
 """Call an RPC from outside of the event loop and block until it finishes. This is the main method by which a caller outside of the EmulationLoop can inject an RPC into the EmulationLoop and wait for it to complete. This method is synchronous so it blocks until the RPC completes or the timeout expires. Args: address (int):
 The address of the mock tile this RPC is for rpc_id (int):
 The number of the RPC payload (bytes):
 A byte string of payload parameters up to 20 bytes timeout (float):
 The maximum time to wait for the RPC to finish. Returns: bytes: The response payload from the RPC """


        self.verify_calling_thread(False, "call_rpc_external is for use **outside** of the event loop")

        response = CrossThreadResponse()

        self._loop.call_soon_threadsafe(self._rpc_queue.put_rpc, address, rpc_id, arg_payload, response)

        try:
            return response.wait(timeout)
        except RPCRuntimeError as err:
            return err.binary_error