(For context, I’m basically referring to Python 3.12 “multiprocessing.Pool Vs. concurrent.futures.ThreadPoolExecutor”…)

Today I read that multiple cores (parallelism) help in CPU bound operations. Meanwhile, multiple threads (concurrency) is due when the tasks are I/O bound.

Is this correct? Anyone cares to elaborate for me?

At least from a theorethical standpoint. Of course, many real work has a mix of both, and I’d better start with profiling where the bottlenecks really are.

If serves of anything having a concrete “algorithm”. Let’s say, I have a function that applies a map-reduce strategy reading data chunks from a file on disk, and I’m computing some averages from these data, and saving to a new file.

  • Zykino@programming.dev
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    30 days ago

    Wow coming from C++/Rust I was about to answer that both are parallelism. I did not knew about python’s GIL. So I suppose this is the preferred way to do concurrency, there is no async/await, and you won’t use Qt “just” for a bit of concurrency. Right ?

    We learn a little bit everyday. Thanks!

    • onlinepersona@programming.dev
      link
      fedilink
      English
      arrow-up
      3
      ·
      edit-2
      30 days ago

      IINM whether it’s “true” parallelism depends on the number of hardware cores (which shouldn’t be a problem nowadays). A single, physical core means concurrency (even with “hyper threading”) and multiple cores could mean parallelism. I can’t remember if threads are core bound or not. Processes can bound to cores on linux (on other OSes too most likely).

      So I suppose this is the preferred way to do concurrency, there is no async/await

      Python does have async which is syntax sugar for coroutines to be run in threads or processes using an executor (doc). The standard library has asyncio which describes valuable usecases for async/await in python.

      and you won’t use At “just” for a bit of concurrency. Right ?

      Is “At” a typo?

      We learn a little bit everyday. Thanks!

      You’re welcome :) I discovered the GIL the hard way unfortunately. Making another person aware of its existence to potentially save them some pain is worth it.

      Anti Commercial-AI license

      • Fred@programming.dev
        link
        fedilink
        arrow-up
        2
        ·
        30 days ago

        I can’t remember if threads are core bound or not.

        On Linux, by default they’re not. getcpu(2) says:

           The getcpu() system call identifies the processor and node on which the
           calling thread or process is currently running and writes them into the
           integers pointed to by the cpu and node arguments.  ...
        
           The  information  placed in cpu is guaranteed to be current only at the
           time of the  call:  unless  the  CPU  affinity  has  been  fixed  using
           sched_setaffinity(2),  the  kernel  might  change  the CPU at any time.
           (Normally this does not happen because the scheduler tries to  minimize
           movements  between  CPUs  to keep caches hot, but it is possible.)  The
           caller must allow for the possibility that the information returned  in
           cpu and node is no longer current by the time the call returns.
        
      • Zykino@programming.dev
        link
        fedilink
        arrow-up
        2
        ·
        30 days ago

        and you won’t use At “just” for a bit of concurrency. Right ?

        Is “At” a typo?

        Yes I wanted to talk about the Qt Framework. But with that much ways to do concurrency in the language’s core, I suspect you would use this framework for more than just its signal/slots feature. Like if you want their data structures, their network or GUI stack, …

        I’m not using Python, but I love to know the quirks of each languages.