sql.Rows, которые вы возвращаете из своего запроса, не могут использоваться одновременно (я считаю).
, но вы можете сделать большую часть тяжелой работы в гортанах.
Вот пример (не работает, но близко к этому), на Play
package main
import "fmt"
import "sql"
type Row struct {
x string
y string
z string
}
func processor(ch chan Row) {
for row := range <-ch {
// be awesome
}
}
func main() {
ch := make(chan Row)
// two handler go routines (current processors)
go processor(ch)
go processor(ch)
rows := db.Query("select x,y,z from whatever")
for rows.Next() {
var row Row
if err := rows.Scan(&row.x, &row.y, &row.z); err != nil {
// do something with error
} else {
ch <- row
}
}
}
Вам необходимо предоставить дополнительную информацию. Если вы не заказываете, это будет невозможно. Набор или в этом случае таблица представляет собой набор неупорядоченных элементов. Чтобы сделать это одновременно, вы должны будете иметь возможность разделить свою коллекцию на поднаборы и обрабатывать каждый отдельно в своем собственном goroutine, агрегируя результаты в области вызова. Вы хотите использовать подход «Разделить и побеждать» и выразить это в алгоритме. Если вы можете предоставить более подробную информацию о данных, я могу помочь вам предложить, как вы можете получить подмножества и обработать их. – evanmcdonnal
Чтобы развернуть это, во-первых, я бы принял решение о том, получаю ли я результаты в одном запросе. Предположим, вы получаете пользователей из базы данных, вы можете, например, использовать предложение where, чтобы разделить полученный текущий набор результатов 200k в 5 разных запросах, каждый из которых сделан из собственного goroutine, выполняющего ect обработки. В качестве альтернативы вы можете сразу получить все результаты, а затем использовать подклассы, чтобы разделить результаты так же, как вы передаете их в метод процесса, который вы вызываете в goroutine. Надеюсь, это поможет! Я дам вам ответ, если вы получите здесь нечто более конкретное. – evanmcdonnal