if __name__ == '__main__': # Не понял зачем эта строка, но так работает
При запуске файла на исполнение интерпретатор создает переменные окружения, для того файла, который запустили переменная __name__ == '__main__'. Если файл импортировали, в __name__ будет относительный путь к модулю, и в блок кода после if управление не попадет. (при импорте файл исполняется)
multiprocessing.Queue. Это синхронизированная очередь.
Создайте экземпляр и отдайте его каждому потоку. Поток пусть добавляет каждую итерацию расчета в список, а список потом отдает в очередь. Как только все потоки завершены, пробегаете по очереди, обрабатываете списки, делаете с ними что хотите.