직렬 및 병렬 JS 약속

일주일 전에 나는 버그를 보고 있었다. 일부 작업이 수행되어 IndexedDB 저장소의 상태가 변경되었습니다.

(자세한 내용은 모두 공개할 수 없으니 양해 부탁드립니다.)

작업 중 하나에 대해 데이터 조각이 다시 계산되고 있었고 이 데이터가 이미 다른 작업의 일부로 계산되었고 후속 작업이 이 사전 계산된 데이터를 참조해야 했기 때문에 이런 일이 발생하지 않아야 했습니다.

이러한 작업이 수행되는 방식은 이러한 작업 목록이 기본적으로 깊이 중첩된 논리를 사용하여 작업을 실행하는 다른 메서드로 전달되기 때문에 명확하고 명확하지 않았습니다.

목록에 있는 모든 작업의 ​​결과를 해결하는 데 Promise.all가 사용된 것으로 나타났습니다.

직렬과 병렬의 차이점



마음속으로 프로세스의 일반적인 모델을 형성했습니다. 작업 1이 수행된 다음 작업 2가 수행되는 식입니다.
작업이 순서대로 발생하는 이 모델을 Serial라고 하며 솔직히 말해서 일반적으로 일이 완료된다고 생각하는 방식입니다.

다른 모델이 있는 것으로 밝혀졌습니다. 작업 1이 수행되고 동시에 작업 2가 수행되고 있습니다. 작업 1의 끝과 작업 2의 시작 사이에는 정확한 순서/관계가 없습니다.
이 모델의 이름은 Parallel이며 이것이 제가 조사한 버그의 원인 중 하나였습니다.

Promise.all은 무엇을 하나요?




const bakeCake = (): Promise<CakeDetails> => {// something};
const eatCake = (): Promise<EatenCakeDetails> => {// something};


Promise.all([bakeCake(), eatCake()]).then((result) => {
    console.warn('Result', result);
});


인생에서 당신은 먼저 케이크를 굽고 나서 먹습니다.

그러나 위의 코드 예제를 사용하면 케이크를 굽고 동시에 먹을 수 있습니다(아직 존재하지 않는 경우 케이크를 굽는 것으로 eatCake 폴백을 가정).

무엇에 좋은가요?



기본적으로 JS에서 동시 작업을 수행하는 방법입니다.

독립적인 비동기 작업을 수행하는 데에만 사용해야 합니다.

위의 진술을 기반으로 cake 예제는 Promise.all의 잘못된 사용이며 비슷한 실수가 내가 보고 있던 버그의 원인이었습니다.

작업을 병렬로 수행하는 방법입니까?



전혀 그렇지 않다.
작업이 병렬로 수행되는 것처럼 보일 수 있지만 그렇지 않습니다. 대신 이 동작에 대한 올바른 용어는 동시입니다.

JS의 일부를 실행하는 것은 단일 스레드이므로 한 번에 하나의 작업만 점유할 수 있습니다.

그리고 Promise.all 의 경우, 이 작업은 작업을 시작하고 일시 중단한 다음 다른 작업을 시작하고 일시 중단하고 이전 작업을 재개하는 등 여러 작업 간에 실제로 바운스됩니다.
따라서 지정된 시간에 단일 작업만 작업 중이기 때문에 호출할 수 없습니다parallel.

(주의: 용어로 인한 혼란을 방지하기 위해 단순화된 이름을 사용하고 있습니다.)

성능에 영향을 줍니까?



Promise.all이 다음 약속으로 진행하기 전에 모든 약속이 해결될 때까지 기다리는 것보다 빠릅니까?
잘 모르겠습니다. 나는 아직 결정적인 대답을 찾지 못했으며 나중에 같은 생각을 공유할 것입니다.

참조



이 게시물은 해당 버그를 처리하고 인터넷에서 다른 기사를 읽은 후 배운 내용을 기반으로 합니다.
  • Javascript is single-threaded? You’re kidding me
  • Parallel vs Concurrent
  • Promise: race, all, allSettled
  • 좋은 웹페이지 즐겨찾기