Before we dive into asynchronous invocation, we have to cover once last topic:
callbacks. Passing a
“callback function” means treating functions (or any callable objects in our case) as
first-class objects, i.e., like any
other value in the language. In C and C++ this is done with
function pointers, but in python,
there’s no special machinery for it. Surely you’ve seen callbacks before:

To explain what the symmetry of RPyC means, consider the following diagram:

As you can see, while the client is waiting for the result (a synchronous request),
it will serve all incoming requests, meaning the server can invoke the callback it had
received on the client. In other words, the symmetry of RPyC means that both the client and
the server are ultimately “servers”, and the “role” is more semantic than programmatic.