Должен ли я вызывать отдельную программу для любой операции asyn c? - PullRequest
0 голосов
/ 14 января 2020

Я только что начал с Go с фоном в NodeJS. Я написал следующую программу, которая открывает соединение с базой данных, запрашивает таблицу базы данных и печатает запись.

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "io"
    "net/http"
)

type User struct {
    gorm.Model
    Username string
    Password string
}



func main() {
    db, err := gorm.Open("mysql","root:1234@(localhost)/database_test")
    db.LogMode(true)
    defer db.Close()
    if err != nil {
        panic("failed to connect to the database")
    }

    var users []User
    db.Table("user").Find(&users)
    fmt.Println("after finding the user")
    fmt.Println("user ", users)
}

Код работает нормально. Но я хочу понять это, не блокирует ли эта программа основной поток? Должен ли я выполнять какую-либо асинхронную операцию c, например, вызов базы данных, сделанный внутри main в отдельной программе?

Я использую Promises с NodeJS, поэтому с Go.

РЕДАКТИРОВАТЬ: После добавления горутина в основной метод * это немного отличается 1012 *

Следующий код вызывает отдельную процедуру для запроса базы данных. Но не блокирует ли он основной поток тем, что ожидает ответа от канала? Если да, лучше ли это сделать?

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "io"
    "net/http"
)

type User struct {
    gorm.Model
    Username string
    Password string
}

func dbRead(db *gorm.DB) <-chan []User {
    c := make(chan []User)
    go func() {
        fmt.Println("starting the go routine to find the users")
        defer close(c)
        var users []User
        db.Table("user").Find(&users)
        c <- users
    }()

    return c
}

func main() {
    db, err := gorm.Open("mysql","root:1234@(localhost)/database_test")
    db.LogMode(true)
    defer db.Close()
    if err != nil {
        panic("failed to connect to the database")
    }

    userList := <-dbRead(db)
    fmt.Println("user ", userList)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...