2013-04-15 1 views
1

저는 새로 나왔습니다. MongoDB 데이터베이스의 모든 사용자를 반복하고 각 사용자가 'mgo'패키지를 사용하여 모든 게시물을 반복하는 간단한 프로그램을 작성하려고합니다. GO 루틴에 MongoDB 데이터베이스를 전달하는 방법은 무엇입니까?

package main 

import (
    "fmt" 
    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
) 

type User struct { 
    Id string 
    Email string 
} 

type Post struct { 
    Id string 
    Description string 
} 

func handleUser(db *mgo.Database, user *User) { 
    fmt.Println("ID: ", user.Id, " EMAIL: ", user.Email) 

    result := Post{} 

    iter := db.C("posts").Find(bson.M{"user_id": user.Id}).Iter() 

    for iter.Next(&result) { 
     fmt.Println("POST ID: ", result.Id, " POST DESCRIPTION: ", result.Description) 
    } 
} 

func main() { 
    session, err := mgo.Dial("localhost") 

    if err != nil { 
     panic(err) 
    } 

    defer session.Close() 

    db := session.DB("mydb") 

    result := User{} 

    iter := db.C("users").Find(nil).Iter() 
    for iter.Next(&result) { 
     handleUser(db, &result) 
    } 
} 

는 그냥 잘 작동하지만 go handleUser(db, &result)handleUser(db, &result)에 대한 호출을 변경하려고하면 handleUser 내부의 두 번째 쿼리는 아무것도하지 않습니다.

'메인'이 이미 완료되었으므로 세션이 이미 닫혔다 고 생각됩니다. 맞습니까? 그렇다면 그러한 시나리오를 처리하는 방법은 무엇입니까?

답변

7

당신은 specs에 대한 맞아, 그들은 주요 반환은, 모든 goroutines 사망 할 때되도록 정의 :

때 기능 주 반환, 프로그램이 종료됩니다. 다른 (non-main) goroutine이 완료 될 때까지 기다리지 않습니다.

두 가지 옵션이 있습니다.

  • 메인 끝에있는 goroutines와 동기화하십시오. "완료"된 샤넬 또는 sync.WaitGroup을 사용할 수 있습니다.

    select{} // Non busy block forever

: 블로킹 빈 선택 문이 사용될 수있는 적절한

  • 관련 문제