具有 Goroutine 和 C# async/await 相同的效果

如果进程在与我们的应用程序服务器不同的 cpu 上继续,使用 async/await 方法会非常有用。


例如,数据库查询在数据库服务器上运行,查询运行时无需阻塞应用程序线程。你可以从这里查看。


让我们看看那个 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}


呼啦一阵风
浏览 111回答 1
1回答

呼如林

Goroutines 和 async/await 是异步编程的不同方法。在引擎盖下,您有 P 进程 M CPU 内核和 G 协程。您的语言运行时操作它们 - 检查何时应该停止(未计划从实际进程,因此 CPU 内核)和其他应该被安排到内核。什么方法更好?这取决于开发商。至于我 async/await 有更多的语法糖,goroutines 在编程方面更明确。所以第一个可以更简洁,第二个 - 在诸如此类的复杂情况下更容易理解select {..}。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go