Comment by JustSomeNobody

4 years ago

Ease of development. Ease of maintenance. Separation of concerns. Just to name a few. For example, one service is for hardware communication. It's job is to communicate with all the various devices, and forward those messages out.

>You can do the same with threads and queues.

Yes, but as OP up the chain mentions, you can simplify by letting the OS handle some of that.

> Ease of development. Ease of maintenance. Seperation of concerns.

I'm not convinced. Managing processes is much more complex than managing threads, particularly if the code should be cross-platform. You need a very good library to hide away all the nasty OS specific details. Same goes for pipes or sockets. Then there is the whole issue of message (de)serialization. I don't see how this can possibly be easier than starting a thread and communicating with concurrent queue.

I mean, subprocesses certainly have their use cases, but I would never see them as a drop-in replacement for threads.

> you can simplify by letting the OS handle some of that.

Processes and threads are both OS resources. For the OS scheduler they are practically equivalent.

  • Consider: what is the easiest way to parallelize GCC to a 32 core system?

    Answer: make -j128.

    Way easier than trying to make every data structure inside of the compiler into a parallel programming model.

    --------

    Process level parallelism is a higher level of thinking. As long as you have spare RAM (and let's be frank, we all have 32GB+ sitting around these days), you can add more and more processes to solve your problem.

    If you are talking data structures and mutexes, you are working at a far more complex layer than what I'm saying for #1.

    ----

    Even completely single threaded code can be run in parallel in many cases in practice, because we have multiple files or other divisions of labor available at the process / user level.

    • > Consider: what is the easiest way to parallelize GCC to a 32 core system?

      > Answer: make -j128.

      > Way easier than trying to make every data structure inside of the compiler into a parallel programming model.

      That's a false dichotomy. If the compiler program was implemented as a library, I would rather create 128 threads that each call compileSourceFile() than spawn 128 subprocesses that do the same thing.

      The question you should be asking is: do I need my task to execute in a seperate address space? If yes, spawn a subprocess, otherwise use a thread.

      14 replies →

  • > I'm not convinced.

    Great! Because that's not what I'm trying to do. Figure out what works best for you. We did.

    > particularly if the code should be cross-platform.

    Ours, currently, does not.

    > Then there is the whole issue of message (de)serialization. I don't see how this can possibly be easier than starting a thread and communicating with concurrent queue.

    We develop in C#. All of this is available from MS.