Threads

The threaded algorithm supports the use of multiple threads.

mpl2005

mpl2014

serial

threaded

supports_threads

✔️

Warning

The threaded algorithm is work in progress and should be considered experimental. It works fine in an isolated environment using the contourpy tests and benchmarks, but needs to be rigorously tested in real-world environments that that include mixed Python/C++ code and multiple threads before it can be considered production quality.

threaded shares most of its code with serial except for the high-level processing of chunks which it performs in parallel using a thread pool, and the creation of NumPy arrays is limited to a single thread at a time.

Note

The domain must be divided into chunks for multithreaded contouring.

Create a ThreadedContourGenerator by calling contour_generator() in the usual way, ensuring that the domain is chunked:

>>> from contourpy import contour_generator
>>> import numpy as np
>>> z = np.ones((100, 50))  # Sample z data.
>>> cont_gen = contour_generator(z=z, name="threaded", chunk_count=5, thread_count=4)
>>> cont_gen.thread_count
4
>>> cont_gen.chunk_count
25

Here the 25 chunks will be divided up between the 4 threads.

The thread_count argument is optional, if not specified the default is thread_count=0 which means it will use the maximum number of threads available. This number can be checked using:

>>> import contourpy
>>> contourpy.max_threads()

Note

contourpy.max_threads() is implemented using the C++ function std::thread::hardware_concurrency.

If you request more threads than the number of chunks, the thread count will be reduced accordingly.

Warning

The order of processing chunks is not deterministic. If you use a LineType or FillType that do not arrange the results by chunk, the order of returned lines/polygons is also not deterministic. This includes LineType.Separate, LineType.SeparateCode, FillType.OuterCode and FillType.OuterOffset.