Не всегда нужно кидаться в разработки потоков. Иногда есть подходы которые обеспечивают компромисс.
Например у тебя 100 000 ссылок. И ты хочешь запустить это в 16 независимых задач (процессов или потоков неважно). Предположим что у тебя уже есть процесс python который решает эту задачу в 1 поток. Далее если мы разделишь эти 100 000 сыслок на 16 частей - то ты можешь запустить 16 копий процесса передав ему параметр. Что-то вроде
$ python3 parser.py links.lst 0
$ python3 parser.py links.lst 1
....
$ python3 parser.py links.lst 15
Здесь параметр links.lst 15 означает что надо брать каждую 15 строку по модулю 16 их исходного файла.