The real question is, "what process model do you use for multiple CPUs?" Assuming a Unixy OS, you can use threads or multiple processes.
If you choose multiple processes, you have to intelligently use IPC to coordinate them. But you can happily use pretty much any language.
If you choose threading, scripting languages are problematic. For example, Python has a Global Interpreter Lock. In that case, I think the only "safe" choices are C++ and Java. Java's safe because its "synchronized methods" enforce locking, often in a wasteful manner. C++ leaves the entire synchronization problem in your lap, giving you infinite room for performance and for subtle and maddening bugs.
Multi-process is generally a better approach than threading. I've seen too much time spent debugging threaded apps to ever recommend that approach. Every hour poured into debugging a deadlock, or worse yet, a mysterious cross-thread heap trampling is an hour taken away from improving the product.
If you choose multiple processes, you have to intelligently use IPC to coordinate them. But you can happily use pretty much any language.
If you choose threading, scripting languages are problematic. For example, Python has a Global Interpreter Lock. In that case, I think the only "safe" choices are C++ and Java. Java's safe because its "synchronized methods" enforce locking, often in a wasteful manner. C++ leaves the entire synchronization problem in your lap, giving you infinite room for performance and for subtle and maddening bugs.
Multi-process is generally a better approach than threading. I've seen too much time spent debugging threaded apps to ever recommend that approach. Every hour poured into debugging a deadlock, or worse yet, a mysterious cross-thread heap trampling is an hour taken away from improving the product.