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 중국어 웹사이트의 기타 관련 기사를 참조하세요!