Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what is the main difference between .net Async and google go light weight thread

Tags:

When calling runtime.GOMAXPROCS(1) in go the runtime will only use one thread for all your goroutines. When doing io your goroutines will yield and let the other goroutines run on the same thread.

This seem very similar to me to how the .net Async CTP feature is doing cooperative concurrency if you are not using background thread.

My question is which advantage or drawback could you think of one methode over the other.

like image 601
skyde Avatar asked Sep 20 '11 02:09

skyde


People also ask

What is difference between thread and async await in C#?

Threads. Async methods are intended to be non-blocking operations. An await expression in an async method doesn't block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

Does Async create a new thread?

An async method will delegate a task to the OS and will not block the main thread, when the OS finishes the processing, it will return to the calling point as a callback.

Are Go channels async?

If you've ever programmed with JavaScript, you definitely know about Promise and async / await . C#, Java, Python, and some other programming languages apply the same pattern using different names such as Task or Future . On the contrary, Go doesn't follow the pattern at all.

Are Goroutines just threads?

Goroutine is a lightweight thread in Golang. All programs executed by Golang run on the Goroutine. That is, the main function is also executed on the Goroutine. In other words, every program in Golang must have a least one Goroutine.


1 Answers

Making value judgements is always a tricky thing so I'll highlight 3 differences. You decide whether they fall into the "pro" or "con" bucket.

  1. While both Go and async allow you to write async code in a straightforward way, in .NET you have to be aware which part of your code is async and which one isn't (i.e. you have to explicitly use async/await keywords). In Go you don't need to know that - the runtime makes it "just work", there is no special syntax to mark async code.

  2. Go design doesn't require any special code in standard library. .NET required adding new code to the standard library for every async operation, essentially doubling API surface for those cases e.g. there's new async http download API and the old, non-async http download API has to remain for backwards compatibility.

  3. Go design and implementation is orders of magnitude simpler. A small piece of runtime code (scheduler) takes care of suspending goroutines that block on system calls and yielding to sleeping goroutines. There is no need for any special async support in standard library.

.NET implementation first required adding the aforementioned new APIs. Furthermore .NET implementation is based on compiler rewriting code with async/await into an equivalent state machines. It's very clever but also rather complicated. The practical result was that the first async CTP had known bugs while Go's implementation was working pretty much from the beginning.

Ultimately, it doesn't really matter. async/await is the best way to write async code in .NET. Goroutines are the best way to get that in Go. Both are great, especially compared to alternatives in most other languages.

like image 186
Krzysztof Kowalczyk Avatar answered Sep 27 '22 22:09

Krzysztof Kowalczyk