나는 두 개념에 대해 상당히 편안하지만 여기에 분명하지 않은 점이 있습니다.
일부 답변을 읽은 후에는 차이점을 설명하는 정확하고 유용한 은유가 있다고 생각합니다.
개별 코드 줄을 별개이지만 주문한 카드로 생각하면 (오래된 학교 펀치 카드의 작동 방식을 설명하는 경우 저를 중지하십시오), 별도의 절차가 작성 될 때마다 고유 한 카드 스택을 갖게됩니다 ( copy & paste!) 및 코드를 정상적으로 및 비동기 적으로 실행할 때 일반적으로 수행되는 작업의 차이점은 관리 여부에 따라 다릅니다.
코드를 실행할 때 OS에 컴파일러에게 전달할 단일 작업 세트 (컴파일러 또는 인터프리터가 "상위"레벨 코드를 파기 한)를 전달합니다. 하나의 프로세서를 사용하면 한 번에 한 줄의 코드 만 실행할 수 있습니다. 따라서 여러 프로세스를 동시에 실행한다는 착시를 달성하기 위해 OS는 주어진 프로세스에서 한 번에 몇 줄만 프로세서를 전송하는 방식을 사용하여 모든 프로세스를 보는 방식에 따라 전환합니다. 적당한. 그 결과 최종 사용자에게 같은 시간에 진행 상황을 보여주는 여러 프로세스가 생성됩니다.
우리의 은유의 관계는 OS가 카드를 프로세서로 보내기 전에 항상 섞습니다. 카드 묶음이 다른 묶음에 의존하지 않으면 다른 묶음이 활성화 된 동안 그 묶음의 선택이 중단 된 것을 알 수 없습니다. 상관하지 않아도 상관 없습니다.
그러나주의를 기울이면 (예 : 서로 의존하는 여러 프로세스 또는 카드 스택이있는 경우) OS 셔플 링으로 인해 결과가 나빠질 수 있습니다.
비동기 코드를 작성하려면 순서가 무엇이든 관계없이 실행 순서 사이의 종속성을 처리해야합니다. 이것이 "콜백"과 같은 구조가 사용되는 이유입니다. 그들은 프로세서에게 "다음으로해야 할 일은 다른 스택에 우리가 한 일을 알리는 것"이라고 말합니다. 이러한 도구를 사용하면 다른 스택이 OS에서 더 이상 명령을 실행할 수 있도록하기 전에 다른 스택에 알릴 수 있습니다. ( "called_back == false 인 경우 : send (no_operation)"-이것이 실제로 어떻게 구현되는지 확실하지 않지만 논리적으로 일관성이 있다고 생각합니다.)
병렬 프로세스의 경우 차이점은 서로 신경 쓰지 않는 두 개의 스택과 처리 할 두 명의 작업자가 있다는 것입니다. 하루가 끝나면 두 스택의 결과를 결합해야 할 수도 있습니다.이 결과는 동기 문제이지만 실행을 위해 다시 신경 쓰지 않아도됩니다.
이것이 도움이되는지 확실하지 않지만 항상 여러 설명이 도움이됩니다. 또한 비동기 실행은 개별 컴퓨터 및 해당 프로세서로 제한되지 않습니다. 일반적으로 말하면 시간 또는 (보다 일반적으로 말하면) 이벤트 순서를 처리합니다. 따라서 종속 스택 A를 네트워크 노드 X로 보내고 연결된 스택 B를 Y로 보내는 경우 올바른 비동기 코드는 마치 랩톱에서 로컬로 실행되는 것처럼 상황을 설명 할 수 있어야합니다.