Since I'm attaching to neovim from an external python program, not as an rplugin, pynvim doesn't start its event loop by default. So I'm spawning a new thread, and starting pynvim's event loop on it. I'm also registering request/notification handlers which I call when pynvim receives RPC messages from neovim. I'm using an "executor" to run the registered callbacks on the main thread. It's working great.
Problem
The design, and usage, of remote plugins can be simplified, as described in https://github.com/neovim/neovim/issues/27949
tl;dr:
pynvim
can callset_handler('foo', myFunction)
to handle the "foo" request from NvimSolution
Reference
Implementation in node-client: https://github.com/neovim/node-client/pull/344
Related work here (this Nvim RPC application does not use rplugins, it sets up its own RPC methods which can be called from the Nvim peer): https://github.com/b0o/blender.nvim/blob/eb495c3d7217efb4bdec4e50d1f9be1372d33e2c/blender_nvim/rpc.py#L115-L127