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