2011-09-20 3 views
17

runtime.GOMAXPROCS (1)을 호출하면 런타임에 모든 goroutines에 대해 하나의 스레드 만 사용됩니다. io를 할 때 goroutine이 생성되어 다른 goroutine이 같은 스레드에서 실행되도록합니다..net Async와 google의 주요 차이점은 무엇입니까

백그라운드 스레드를 사용하지 않는 경우 .net Async CTP 기능이 협업 동시성을 수행하는 방식과 매우 유사합니다.

제 질문은 어떤 이점이나 단점이 다른 방법보다 더 바람직하다고 생각할 수 있는지입니다.

답변

23

가치 판단을 내리는 것은 항상 까다로운 일이므로 3 가지 차이점을 강조하겠습니다. 당신은 그들이 "pro"또는 "con"버킷에 속하는지 여부를 결정합니다.

  1. 모두 당신이 비동기입니다 코드의 어떤 부분과 하나가하지 않은 알고 있어야합니다 .NET, 당신은 간단한 방법으로 비동기 코드를 작성할 수 비동기 이동 (즉, 명시 적으로을에 가지고 있지만 비동기/키워드 기다리기). Go에서는 런타임이 "그냥 작동"하게 만들고, 비동기 코드를 표시하는 특별한 구문은 없다는 것을 알 필요가 없습니다.

  2. Go 디자인은 표준 라이브러리에서 특별한 코드를 요구하지 않습니다. .NET은 모든 비동기 작업에 대해 표준 라이브러리에 새로운 코드를 추가해야합니다. 새로운 비동기 http 다운로드 API가 있으며 이전 버전의 비동기 http 다운로드 API는 이전 버전과의 호환성을 위해 남아 있어야합니다.

  3. Go 설계 및 구현의 순서는 간단합니다. 작은 런타임 코드 (스케줄러)는 시스템 호출을 차단하고 수면 용 goroutine에 굴복하는 goroutines를 일시 중단합니다. 표준 라이브러리에는 특별한 비동기 지원이 필요하지 않습니다.

위의 새 API를 먼저 추가해야합니다. 또한 .NET 구현은 비동기/상응하는 상태 머신으로 코드를 다시 작성하는 컴파일러를 기반으로합니다. 그것은 매우 똑똑하지만 다소 복잡합니다. 실용적인 결과는 처음의 비동기식 CTP는 버그를 알고 있었고 Go의 구현은 처음부터 거의 작동하고있었습니다.

궁극적으로,별로 중요하지 않습니다. async/await는 .NET에서 비동기 코드를 작성하는 가장 좋은 방법입니다. 골 루틴은 Go에서 그것을 얻는 가장 좋은 방법입니다. 둘 다 훌륭합니다. 특히 다른 언어의 대체 언어와 비교하면 좋습니다.

+0

정말 대단히 감사합니다. 나는 2 개 언어 중 하나를 고를 필요가있는 사람들을 위해 실행 속도를 향상 시키려고 생각했다. – skyde

+10

동의하지 않습니다. 프로세스 당 스레드 (채널은 단순히 동기식 큐입니다)를 사용하여 C# 및 Java에서 go-style goroutines을 작성할 수 있습니다. 많은 경우 Go Gooroutine이 소수의 OS 스레드에서 다중화된다는 사실에 신경 쓰지 않습니다. C# async는 특정 코드가 동일한 OS 스레드에서 실행된다는 것을 약속합니다. 이것은 UI 스레드의 경우에 매우 좋습니다. 너는 약속을 지킬 수 없다. –

+0

sombody는 Go에서 시뮬레이션 대기 상태를 예제로 제공 할 수 있습니까? 내가 아는 한, 그런 것은 없다. – Kugel

관련 문제