26

나는 혼란스러워. 한 명 또는 여러 명은 어떻게 할 수 있습니까?Task단일 스레드에서 병렬로 실행합니까? 내 이해병행분명히 틀렸다.

MSDN의 비트 머리를 감쌀 수 없습니다.

async 및 await 키워드로 인해 추가 스레드가 발생하지 않습니다.   만들어진. 비동기 메서드는 다중 스레드를 필요로하지 않습니다. 비동기   메서드가 자체 스레드에서 실행되지 않습니다. 이 메서드는 현재 실행됩니다.   동기화 컨텍스트를 사용하고 스레드에서 시간을 사용하는 경우에만   메서드가 활성화되어 있습니다.

.. 그리고 :

작업 시작과 대기 사이에 다른 작업을 시작할 수 있습니다.   추가 작업은 암시 적으로 병렬로 실행되지만 추가 작업은 수행되지 않습니다.   스레드가 생성됩니다.

1 답변


24

그들은 병렬로 작동하지 않으며, 교대로 작동합니다. 실행중인 작업에 대한 진행이 차단되면 상태를 저장하고 준비된 작업에 제어 권한을 부여합니다. 진정한 병렬 처리가 아니라 협업 멀티 태스킹입니다.

스레드는 샘플 원칙에 따라 작동합니다. 그러나 강조하고 싶은 몇 가지 중요한 차이점이 있습니다.

첫째,async/awaitOS 스레드가 아닙니다.

  • 작업에 다른 스레드 ID가 표시되지 않습니다.
  • Thread-local storage는 Task가 발생했을 때 자동적으로 context-switched되지 않습니다.

둘째, 행동의 차이 :

  • async/await협업 멀티 태스킹을 사용하면 Win32 스레드는 선제를 사용합니다. 따라서 모든 블로킹 작업은 명시 적으로 컨트롤을 생성해야합니다.async/await모델. 그래서 당신은 모든 쓰레드와 모든 태스크를 블로킹하도록 만들 수 있습니다.
  • 태스크는 다중 처리 시스템에서 병렬로 실행되지 않습니다. 재진입이 제어되기 때문에 데이터 구조가 일관성있게 유지됩니다.

Stephen이 의견에서 지적한 것처럼양철통다중 스레드 동기화 컨텍스트를 사용하는 경우 여러 OS 스레드에서 동시 실행을 얻습니다 (모든 복잡성 및 잠재적 경쟁 조건과 함께). 그러나 MSDN 인용문은 단일 스레드 상황에 관한 것입니다.

마지막으로,이 동일한 패러다임이 사용 된 다른 장소, 좋은 연습에 대해 많은 것을 배울 수 있습니다.async/await이것들을 연구함으로써 :

  • Win32섬유(스레드와 동일한 호출 스타일을 사용하지만 협업)
  • Win32겹친 I / O운영, Linux가는
  • 코 루틴


  • "차단 된" 비동기의 목표는 차단을 피하기위한 것이므로 여기에서 사용하는 용어는 혼란 스러울 수 있습니다. - Cory Nelson
  • +1. 참고로async메서드는 차단 될 때 상태와 항복을 저장합니다.~에await. 차단 코드가 실행중인 경우 (예 :Thread.Sleep), 그 상태와 수익률을 저장하지 않습니다. - Stephen Cleary
  • @Cory : 개별 작업이 차단되고 스레드가 실행되지 않습니다. (스티븐이 말한 것처럼, 모든 것에 코 루틴을 사용하는 경우에만 해당). - Ben Voigt
  • 나는 그것이 분명해야한다고 생각한다. 왜 MS가 이것을 왜곡 한 것이다. 많은 사람들은 "비동기" 메서드를 비동기 적으로 실행합니다 (별도의 스레드에서). 아니야. 그리고 또한await SomeMethodAsync()AWAIT 때문에 새 스레드를 만들지 않습니다. SomeMethodAsync가 새 스레드를 만드는 경우 새 스레드가 생성됩니다 (반드시 수행하지는 않음). - igrimpe
  • @BenVoigt : 업데이트 된 답변이 많은 것은async단일 스레드 내에서 실행되는 메소드SynchronizationContext(예 : UI 컨텍스트). 콘솔 앱이나 백그라운드 스레드에서 실행되는 경우Task스레드 풀에서 실행되며의지여러 스레드에서 병렬로 실행하십시오.await각각 하나씩. - Stephen Cleary

연결된 질문


관련된 질문

최근 질문