2015-11-11 4 views
4

Метод next() является последовательным, есть ли способ одновременного повторения цикла?Как параллельно перебирать результирующий набор sql в Голанге?

У меня есть набор из 200 тыс. Строк, которые я циклически повторяю и выполняю логику в каждой строке и хочу разбить ее.

+0

Вам необходимо предоставить дополнительную информацию. Если вы не заказываете, это будет невозможно. Набор или в этом случае таблица представляет собой набор неупорядоченных элементов. Чтобы сделать это одновременно, вы должны будете иметь возможность разделить свою коллекцию на поднаборы и обрабатывать каждый отдельно в своем собственном goroutine, агрегируя результаты в области вызова. Вы хотите использовать подход «Разделить и побеждать» и выразить это в алгоритме. Если вы можете предоставить более подробную информацию о данных, я могу помочь вам предложить, как вы можете получить подмножества и обработать их. – evanmcdonnal

+0

Чтобы развернуть это, во-первых, я бы принял решение о том, получаю ли я результаты в одном запросе. Предположим, вы получаете пользователей из базы данных, вы можете, например, использовать предложение where, чтобы разделить полученный текущий набор результатов 200k в 5 разных запросах, каждый из которых сделан из собственного goroutine, выполняющего ect обработки. В качестве альтернативы вы можете сразу получить все результаты, а затем использовать подклассы, чтобы разделить результаты так же, как вы передаете их в метод процесса, который вы вызываете в goroutine. Надеюсь, это поможет! Я дам вам ответ, если вы получите здесь нечто более конкретное. – evanmcdonnal

ответ

3

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 
     } 
    } 
} 
Смежные вопросы