有Goroutine和C#async/await一样的效果
Have Goroutine and C# async/await same effect
如果进程在与我们的应用程序服务器不同的 cpu 上继续,则使用 async/await 方法非常有用。
例如,数据库查询在数据库服务器上运行,查询 运行 时无需阻塞应用程序线程。您可以从 here.
查看
让我们看看那个 c# 代码块
public async Task SaveAsync(User user)
{
using (DataContext ctx = new DataContext())
{
ctx.User.Add(user);
// database does its job while we are waiting
await ctx.SaveChangesAsync();
}
}
下面的goroutine代码有同样的效果吗?
func (u *User) Create(userModel *model.User) error {
var err error
var wg sync.WaitGroup
//or channel can be used for sync
wg.Add(1) //wg := make(chan int)
go func() {
defer wg.Done(). //wg <- 1
_, err = u.Transaction.User.
Create().
SetAge(userModel.Age).
SetName(userModel.Name).
SetIsDeleted(false).
Save(u.Ctx)
}()
wg.Wait() // <-wg
if err !=nil{
return err
}
return nil}
Goroutines 和 async/await 是异步编程的不同方法。在引擎盖下,您有 P 个进程 M CPU 个核心和 G 个协程。您的语言运行时运行它们 - 检查何时应该停止一个(未从实际进程中调度,因此 CPU 核心)和其他应该被调度到核心。
哪种方法更好?这取决于开发人员。至于我 async/await 有更多的语法糖,goroutines 在编程方面更明确。所以首先可以更简洁,其次 - 在 select {..}
等复杂情况下更容易理解。
如果进程在与我们的应用程序服务器不同的 cpu 上继续,则使用 async/await 方法非常有用。
例如,数据库查询在数据库服务器上运行,查询 运行 时无需阻塞应用程序线程。您可以从 here.
查看让我们看看那个 c# 代码块
public async Task SaveAsync(User user)
{
using (DataContext ctx = new DataContext())
{
ctx.User.Add(user);
// database does its job while we are waiting
await ctx.SaveChangesAsync();
}
}
下面的goroutine代码有同样的效果吗?
func (u *User) Create(userModel *model.User) error {
var err error
var wg sync.WaitGroup
//or channel can be used for sync
wg.Add(1) //wg := make(chan int)
go func() {
defer wg.Done(). //wg <- 1
_, err = u.Transaction.User.
Create().
SetAge(userModel.Age).
SetName(userModel.Name).
SetIsDeleted(false).
Save(u.Ctx)
}()
wg.Wait() // <-wg
if err !=nil{
return err
}
return nil}
Goroutines 和 async/await 是异步编程的不同方法。在引擎盖下,您有 P 个进程 M CPU 个核心和 G 个协程。您的语言运行时运行它们 - 检查何时应该停止一个(未从实际进程中调度,因此 CPU 核心)和其他应该被调度到核心。
哪种方法更好?这取决于开发人员。至于我 async/await 有更多的语法糖,goroutines 在编程方面更明确。所以首先可以更简洁,其次 - 在 select {..}
等复杂情况下更容易理解。