>  기사  >  백엔드 개발  >  C# 작업 async/await 및 Golang의 고루틴

C# 작업 async/await 및 Golang의 고루틴

PHPz
PHPz앞으로
2024-02-09 23:40:09747검색

C# 任务 async/await 与 Golang 的 goroutine

php 편집기 Baicao는 오늘 C# 언어의 async/await 작업과 Golang 언어의 goroutine을 소개합니다. 두 기술 모두 동시 작업을 처리할 때 더 간단하고 효율적인 솔루션을 제공하는 동시 프로그래밍을 구현하는 방법입니다. async/await 및 goroutine을 사용하면 개발자는 고성능, 동시성 프로그램을 쉽게 작성할 수 있으므로 애플리케이션 응답 속도와 사용자 경험이 향상됩니다. 두 기술의 특징과 활용법을 살펴보겠습니다!

질문 내용

저는 한동안 C#과 Golang을 배워서 비동기 프로그래밍을 지원하는 방식을 비교하려고 노력했습니다.

고루틴에 대한 나의 이해는 go 런타임이 다른 물리적/기계 스레드에서 실행되도록 고루틴을 예약할 수 있다는 것입니다. 고루틴이 차단된 경우(예: 동기적으로 I/O를 기다리는 경우) go 런타임은 고루틴을 일시 중지하고 물리적 스레드를 해제하여 다른 고루틴을 실행할 수 있습니다.

C# Task 与 goroutine 类似,因为它也是物理线程之上的抽象。然而,在 async Task 内进行阻塞 I/O 被认为是一个坏主意,因为“整个线程将被阻塞,导致死锁”。 C#运行时不能做一些类似于goroutine的事情来挂起被阻塞的async Task并释放物理线程来运行其他async Task?

저는 이 문제로 한동안 고군분투했는데 이 문제를 더 잘 설명하는 공개 자료를 찾을 수 없습니다. 어쩌면 내 이해가 틀렸을 수도 있습니다. 누구든지 나를 도와줄 수 있나요?

Solution

C# 작업은 물리적 스레드 위에 있는 추상화라는 점에서 고루틴과 유사합니다.

매우 높은 수준에서 보면 그렇습니다. 아마도 비슷할 것입니다.

그러나 비동기 작업에서 I/O 차단을 수행하는 것은 "전체 스레드가 차단되어 교착 상태가 발생"하기 때문에 나쁜 생각으로 간주됩니다.

블로킹이 반드시 교착 상태로 이어지는 것은 아니지만, 블로킹은 작업이 완료될 때까지 호출 스레드를 차단합니다. 그게 요점입니다.

C# 런타임은 비동기 작업 차단을 일시 중단하고 물리적 스레드를 해제하여 다른 비동기 작업을 실행하기 위해 goroutine과 유사한 작업을 수행할 수 없나요?

Async 메소드는 await 即可获得您想要的行为。阻塞专门用于阻塞线程。从概念上讲,goroutine 有点像让每个方法都为 async 并在各处隐式使用 await만 사용하세요.

보다 일반적인 경우 C# 런타임은 고루틴과 유사한 작업을 수행하여 차단을 처리합니다. 이전 버전과의 호환성으로 인해 C# 런타임은 이 작업을 쉽게 수행할 수 없습니다. 녹색 스레드/코루틴 접근 방식이 더 어려운 "특수 스레드"(UI 스레드, COM STA 스레드 등)에 의존하는 레거시 코드도 많이 있습니다. Go는 근본적으로 완전히 새로운 생태계를 만들어 이전 버전과의 비호환성 문제를 방지합니다.

위 내용은 C# 작업 async/await 및 Golang의 고루틴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제