Member-only story
How to Launch Parallel Tasks in Python
Utilizing concurrent.futures, a high-level interface for asynchronously executing callables

By reading this piece, you will learn how to use the concurrent.futures
library to run tasks asynchronously in Python. It is a better alternative to the threading
and multiprocessing
classes in Python due to the fact that it implemented both Thread
and Process
with the same interface, which is defined by the abstract Executor
class. The official documentation reveals one major problem with Thread
:
“In CPython, due to the
Global Interpreter Lock
, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation).”
Besides, the threading
class does not allow you to return a value from the callable functions except null
. The main concept of the concurrent.futures
module lies with the Executor
class. It is an abstract class that provides methods to execute calls asynchronously. Instead of using it directly, we will be using the subclasses that inherit from it:
ThreadPoolExecutor
ProcessPoolExecutor
Let’s proceed to the next section and start writing some Python code.
1. ThreadPoolExecutor
Import
Add the following import declaration at the top of your Python file:
from concurrent.futures import ThreadPoolExecutor
import time
Callable function (target)
Let’s define a new function that serves as the callable function for the asynchronous call. I will just define a simple function that sleeps for two seconds and returns the multiplication of both input parameters as a result after that:
def wait_function(x, y):
print('Task(', x,'multiply', y, ') started')
time.sleep(2)
print('Task(', x,'multiply', y, ') completed')
return x * y
Single task
The next step is to create a ThreadPoolExecutor
object. It is highly recommended to wrap it inside the with
context manager, as it will call the shutdown
function on its own and free up the resources once…