具有Goroutine和C#异步/等待相同的效果

问题描述

如果进程在与应用服务器不同的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}

解决方法

Goroutine和async / await是异步编程的不同方法。在后台,您有P个进程,M个CPU内核和G个协程。您的语言运行时将对它们进行操作-检查何时应停止运行(不从实际进程中调度,因此不应该调度到CPU内核),而其他应调度到内核中。

哪种方法更好?这取决于开发人员。至于我异步/等待有更多的语法糖,goroutines在编程方面更明确。因此,首先可以更简洁,其次-在诸如select {..}等复杂情况下更容易理解。