Go изначально concurrent. Из коробки лучше масштабируется. Например для двух ядер что нибудь вроде
var Data []uint64 //700 млн 64бит uint значений
var Respond []uint64 //значения около 100.000 на каждый запрос
var res chan uint64 //канал передачи годных значений
func TakeFromData(DataPart []uint64, res chan uint64){ //функция фильтра которой передается часть данных и канал годных
for _, val := range DtaPart{
if Good(val){
res <- val //пишет годные в канал
}
}
}
go TakeFromData(Data[:len(Data)/2], res) //запускается конкурентно в отдельном потоке
go TakeFromData(Data[len(Data)/2:], res) // несколько экземпляров
for val:=range res{ //агрегатор в своем потоке читает из канала по мере фильтрации
Respond:=append(Respond, val) //и формирует результат
}
Конечно можно написать multithreaded на С, только мороки будет больше.