설명하는 문제는 두 가지입니다.
- 작성하는 프로그램 은 외부에서 볼 때 전체적으로 비동기 적으로 동작해야합니다 .
- 그것은해야 하지 함수 호출이 잠재적으로 제어를 포기 여부 호출 사이트에서 볼 수 있습니다.
이것을 달성하는 몇 가지 방법이 있지만 기본적으로
- 다중 스레드 (일부 추상화 레벨)
- 언어 수준에서 여러 종류의 기능을 가지고 있으며, 모두 이와 같이 불립니다
foo(4, 7, bar, quux)
.
(1)의 경우 여러 프로세스를 포크하고 실행하고 여러 커널 스레드를 생성하며 언어 런타임 수준 스레드를 커널 스레드로 예약하는 녹색 스레드 구현을 함께 묶습니다. 문제의 관점에서 그들은 동일합니다. 이 세계에서는 어떤 함수도 스레드의 관점에서 제어를 포기하거나 잃지 않습니다 . 자체가 스레드 때로는 때로는 제어를하지 않고가 실행되고 있지 않습니다하지만 당신은이 세상에서 자신의 스레드의 제어를 포기하지 않습니다. 이 모델에 적합한 시스템은 새 스레드를 생성하거나 기존 스레드에서 조인하는 기능이 있거나 없을 수 있습니다. 이 모델에 맞는 시스템 은 Unix와 같은 스레드 를 복제 하는 기능이 있거나 없을 수 있습니다 fork
.
(2) 흥미 롭습니다. 정의를 수행하기 위해서는 소개 및 제거 양식에 대해 이야기해야합니다.
await
Javascript와 같은 언어에 암시 적을 역 호환성으로 추가 할 수없는 이유를 보여 드리겠습니다. 기본 아이디어는 사용자에게 약속을 제공하고 동기 컨텍스트와 비동기 컨텍스트를 구분함으로써 Javascript가 동기 및 비동기 함수를 균일하게 처리하지 못하게하는 구현 세부 사항을 유출한다는 것입니다. await
비동기 함수 본문 외부에서 약속 을 할 수 없다는 사실도 있습니다 . 이러한 설계 선택은 "발신자에게 비동기 성을 보이지 않게"와 호환되지 않습니다.
람다를 사용하여 동기 함수를 도입하고 함수 호출로 제거 할 수 있습니다.
동기식 기능 소개 :
((x) => {return x + x;})
동기 기능 제거 :
f(4)
((x) => {return x + x;})(4)
이를 비동기 함수 도입 및 제거와 대조 할 수 있습니다.
비동기 함수 소개
(async (x) => {return x + x;})
비동기 함수 제거 (참고 : async
함수 내에서만 유효 )
await (async (x) => {return x + x;})(4)
여기서 근본적인 문제 는 비동기 함수도 promise 객체를 생성하는 동기 함수라는 것 입니다.
다음은 node.js repl에서 비동기 함수를 동 기적으로 호출하는 예입니다.
> (async (x) => {return x + x;})(4)
Promise { 8 }
비동기식과 동기식 함수 호출의 차이가 호출 사이트에 표시되지 않고 정의 사이트에 표시되지 않는 동적 언어 유형의 언어를 가정 할 수 있습니다.
이와 같은 언어를 사용하여 Javascript로 낮추는 것이 가능하므로 모든 기능을 효과적으로 비 동기화해야합니다.