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