问题描述
如果进程在与应用服务器不同的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 {..}
等复杂情况下更容易理解。