> 웹 프론트엔드 > JS 튜토리얼 > Promise 수가 많은 `Promise.all`을 사용할 때 메모리 소비를 효율적으로 관리하는 방법은 무엇입니까?

Promise 수가 많은 `Promise.all`을 사용할 때 메모리 소비를 효율적으로 관리하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-14 21:27:02
원래의
659명이 탐색했습니다.

How to Efficiently Manage Memory Consumption When Using `Promise.all` with a Large Number of Promises?

Promise.all 메모리 소비: 포괄적인 솔루션

이 경우 문제는 상당한 수(58k)의 Promise가 있기 때문에 발생합니다. 해결될 준비가 되었습니다. 각 약속이 이행되기를 기다리면서 관련 비동기 함수 및 결과 데이터가 누적되어 결국 과도한 메모리 소비로 이어집니다.

효율적인 약속 관리

메모리 사용량을 최적화하려면 다음을 피하세요. 많은 수의 Promise와 해당 데이터를 메모리에 동시에 보유합니다. 대신, 동시 작업(약속) 수를 합리적인 값("X"라고 함)으로 제한하세요. 예를 들어, 비율 제한기가 초당 20개의 요청을 허용하는 경우 X를 5 또는 10으로 설정하는 것이 적절한 절충안이 될 수 있습니다.

동시성 제어 구현

여러 접근 방식이 있습니다. 동시성 제어를 시행하려면:

1. 동시성 옵션이 있는 Promise.map():
Bluebird의 Promise.map()은 최대 동시 작업 수를 지정할 수 있는 동시성 옵션을 제공합니다. 이는 동시성 관리 프로세스를 단순화합니다.

2. 수동 약속 관리:
또는 사용자 정의 코드를 구현하여 동시성을 관리할 수도 있습니다. 아래 예에서는 이러한 접근 방식을 보여줍니다.

function mapConcurrent(items, maxConcurrent, fn) {
    // Limit concurrent operations to `maxConcurrent`
    let inFlightCntr = 0;

    return new Promise((resolve, reject) => {
        function runNext() {
            let i = index;
            let prom = fn(items[index], index++).then(...);
            inFlightCntr++;
            prom.finally(() => { inFlightCntr--; });
            prom.then(...); // Run resolve/reject based on returned promise
        }

        function run() {
            // Process items while count is below the limit
            while (inFlightCntr < maxConcurrent && index < items.length) {
                runNext();
            }

            // Resolve or reject parent promise based on completion
        }

        run();
    });
}
로그인 후 복사

3. 자리 표시자 교체:

해결된 데이터가 필요하지 않은 경우 숫자와 같은 간단한 자리 표시자로 교체하여 가비지 수집을 가속화할 수 있습니다.

const p = backgroundScheduler.getClanProfile(clanTags[i], true).then(data => {
    return 0;     // Replace resolved value to promote garbage collection
});
promiseArray.push(p);
로그인 후 복사

위 내용은 Promise 수가 많은 `Promise.all`을 사용할 때 메모리 소비를 효율적으로 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿