https://medium.com/@circular.dynasty/multithreading-and-multiprocessing-in-python-maximizing-performance-dc800df14156