Reputation: 1095
Using async/await aproach if process continue on different cpu from our application server is can be very useful.
For example a database query runs on database server, no need to block application thread while query is running. You can check it from here.
Lets look at that c# code block
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();
}
}
So has goroutine code below same effect ?
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}
Upvotes: 0
Views: 1720
Reputation: 12855
Goroutines and async/await are different approaches to asynchronous programming. Under the hood you have P processes M CPU cores and G coroutines. Your language runtime operates them - checks when one should be stopped (unscheduled from real processes and thus CPU cores) and others should be scheduled to cores.
What approach is better? It depends on developer. As for me async/await has more syntax sugar, goroutines is more explicit in terms of programming. So first can be more concise, second - easier understandable in complex cases like select {..}
and so on.
Upvotes: 4