Mysql 我应该为任何异步操作调用单独的goroutine吗?
我刚开始学习Go,背景是NodeJS。我编写了以下程序,打开与数据库的连接,查询数据库表并打印记录Mysql 我应该为任何异步操作调用单独的goroutine吗?,mysql,go,asynchronous,goroutine,go-gorm,Mysql,Go,Asynchronous,Goroutine,Go Gorm,我刚开始学习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 Use
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)
}
代码运行良好。但是我想了解这一点,这个程序不是阻止了主线程吗?我应该在单独的goroutine中执行任何异步操作,比如在main
内部进行的数据库调用吗
我一直在使用NodeJS的Promises
,所以使用Go时感觉有点不同
编辑:在主方法中添加goroutine后
下面的代码调用一个单独的goroutine来查询数据库。但是它是否仍然阻塞了主线程,因为它正在等待来自通道的响应?如果是,是否有更好的方法
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)
}
主程序包
进口(
“fmt”
“github.com/gin gonic/gin”
_“github.com/go-sql-driver/mysql”
“github.com/jinju/gorm”
“io”
“net/http”
)
类型用户结构{
戈姆模型
用户名字符串
密码字符串
}
func dbRead(db*gorm.db)这在很大程度上取决于您希望在程序中实现什么。在这种情况下,main确实会阻塞,但取决于您在main中还想做什么,您可能想去goroutines,也可能不想去goroutines。如果使用goroutines,很可能会使用通道在方法之间进行数据交换。@favoretti通过添加go例程并接收通道的响应来更新我的问题。但问题仍然是一样的?看起来在我收到来自频道主线程的响应之前,它会一直被阻塞?我想这只是目前的学术问题。要解除对main的阻止,您需要在另一个goroutine中使用来自您通道的消息:)也就是说,main应该等待goroutine完成工作,如果您在启动不受控制的goroutine时退出main,main将直接退出而不等待它们完成。检查一下,你就会知道什么时候使用goroutines。在那之前,保持简单。模拟nodejs所做的一切完全没有意义。围棋是一种非常不同的语言。它很大程度上取决于你想在你的程序中实现什么。在这种情况下,main确实会阻塞,但取决于您在main中还想做什么,您可能想去goroutines,也可能不想去goroutines。如果使用goroutines,很可能会使用通道在方法之间进行数据交换。@favoretti通过添加go例程并接收通道的响应来更新我的问题。但问题仍然是一样的?看起来在我收到来自频道主线程的响应之前,它会一直被阻塞?我想这只是目前的学术问题。要解除对main的阻止,您需要在另一个goroutine中使用来自您通道的消息:)也就是说,main应该等待goroutine完成工作,如果您在启动不受控制的goroutine时退出main,main将直接退出而不等待它们完成。检查一下,你就会知道什么时候使用goroutines。在那之前,保持简单。模拟nodejs所做的一切完全没有意义。围棋是一种非常不同的语言。