Or Go. Though unlike Erlang processes, Go doesn't make mutating shared memory in multiple threads impossible. Go just makes it really easy to never do it.
We're just starting a new project this week. It's not that complicated in the big scheme of things, but there are several bits of hardware that need to be coordinated which maintain their own state, plus a GUI, logging, and database updates.
We'd initially talked about what modules and what main threads would be needed, but I started getting paranoid.
So we're going to be using the Python multiprocessing library, and ZeroMQ plus JSON for the communication between the parts.