When tasks are identical, only differ from the data they operate on, and can be executed in any order, the problem is said to be embarrassingly parallel
Concurrency works best in algorithms that require the execution of a specific action n number of times. If this action is outside our computer scope (waiting for the response of an api) multithreading is the perfect option in order to minimize unused computing resources.
Python is often pointed as difficult to use for multithreaded tasks. However the ThreadPoolExecutor module part of the concurrent.futures …