>웹 프론트엔드 >JS 튜토리얼 >병렬 js와 병렬 자바 스크립트

병렬 js와 병렬 자바 스크립트

Christopher Nolan
Christopher Nolan원래의
2025-02-18 08:51:09307검색
<: :> paralleljs : 우아한 웹 워커 솔루션 ParallelJS는 웹 작업자를 사용할 때 발생할 수있는 문제에 대한 우아한 솔루션을 제공하므로 편리한 추상화 및 도우미 도구가있는 실용적인 API를 제공합니다. HTML5가 도입 한 작업자 인터페이스는 장기 시간과 높은 계산 요구를 가진 기능을 생성 할 수 있으며, 이는 웹 사이트 응답 속도를 개선하기 위해 동시에 사용할 수 있습니다. ParallelJS는 JavaScript 코드의 병렬화를 허용하여 동시 멀티 스레딩 (SMT)을 활용하여 최신 CPU를보다 효율적으로 사용합니다. ParallelJS 라이브러리는 ,

및 와 같은 메소드를 제공하며,이 방법은 계산, 프로세스 데이터 및 집계 단편화 결과를 병렬로 수행하는 데 사용됩니다.

html5가 가져온 가장 멋진 새로운 가능성 중 하나는 웹 작업자 API의 작업자 인터페이스입니다. 그 전에는 사용자에게 반응 형 웹 사이트를 보여주기 위해 몇 가지 팁을 채택해야했습니다. 작업자 인터페이스를 통해 장기 시간과 높은 계산 요구로 기능을 만들 수 있습니다. 또한 작업자 인스턴스를 동시에 사용할 수 있으므로 필요에 따라 해당 작업자를 여러 번 생성 할 수 있습니다. 이 기사에서는 Multithreading이 중요한 이유와 ParallentJS를 사용하여 JavaScript로 구현하는 방법에 대해 설명합니다. spawn 왜 멀티 스레딩이 필요합니까? map 이것은 합리적인 질문입니다. 역사적으로 스레드를 생성하는 능력은 프로세스에서 작업을 나누는 우아한 방법을 제공합니다. 운영 체제는 각 스레드에 가용 시간을 예약해야하므로 우선 순위가 높고 워크로드가 높은 스레드가 우선 순위가 낮은 유휴 스레드보다 우선합니다. 지난 몇 년 동안 SMT (Simultiple Multithreading)는 현대 CPU 컴퓨팅 파워에 액세스하는 열쇠가되었습니다. 그 이유는 간단합니다. 무어의 법칙은 여전히 ​​단위 영역 당 트랜지스터 수 측면에서 여전히 유효합니다. 그러나 여러 가지 이유로 주파수 스케일링을 중지해야합니다. 따라서 사용 가능한 트랜지스터는 다른 방식으로 사용해야합니다. 건축 개선 (SIMD) 및 멀티 코어가 최선의 선택을 대표한다고 결정되었습니다. reduce

SMT를 사용하려면 병렬 코드, 즉 단일 결과를 얻기 위해 병렬로 실행되는 코드를 작성해야합니다. 대부분의 순차적 코드는 병렬화하기 어렵거나 비효율적이기 때문에 일반적으로 특수 알고리즘을 고려해야합니다. 그 이유는 Amdahl 's Law입니다.이 법은 가속 비율이 다음 공식에 의해 주어진다는 것을 나타냅니다.

여기서 n

는 평행 작업자 (예 : 프로세서, 코어 또는 스레드)의 수이며 p

는 평행 부분입니다. 앞으로 병렬 알고리즘에 의존하는 더 많은 멀티 코어 아키텍처가 사용될 수 있습니다. 고성능 컴퓨팅 분야에서 GPU 시스템 및 Intel Xeon Phi와 같은 특수 아키텍처는 이러한 플랫폼을 나타냅니다. 마지막으로 일반적인 동시 응용 프로그램 또는 알고리즘과 병렬 실행을 구별해야합니다. 병렬 처리는 계산의 (아마도 관련 적) 동시 실행입니다. 반대로, 동시성은 독립적 인 실행 프로세스의 조합입니다.

javaScript Parallel JavaScript with ParallelJS 의 멀티 스레딩 JavaScript에서는 이미 동시 프로그램을 작성하는 방법, 즉 콜백 기능 사용 방법을 이미 알고 있습니다. 이 지식은 이제 병렬 프로그램의 생성으로 이전 될 수 있습니다! 자체 구조에 따르면, JavaScript는 이벤트 루프 (일반적으로 반응기 패턴)에 의해 매개되는 단일 스레드에서 실행됩니다. 예를 들어, 이는 (외부) 리소스에 대한 비동기 요청을 처리 할 수있는 좋은 추상화를 제공합니다. 또한 이전에 정의 된 콜백이 항상 동일한 실행 스레드에서 발사되도록합니다. 교차 스레드 예외, 인종 조건 또는 스레드와 관련된 기타 문제는 없습니다. 그러나 이것은 우리에게 JavaScript의 SMT에 더 가깝지 않습니다. 작업자 인터페이스가 도입되면 우아한 솔루션이 발견되었습니다. 주요 응용 프로그램 관점에서 웹 워커의 코드는 동시에 실행되는 작업으로 간주되어야합니다. 커뮤니케이션도 이런 식으로 수행됩니다. 포함 된 웹 사이트에서 호스팅 된 페이지에 이르는 커뮤니케이션에도 사용할 수있는 메시지 API를 사용합니다. 예를 들어, 다음 코드는 이니셔티브에 메시지를 보내어 들어오는 메시지에 응답합니다.

이론적으로는 웹 워커가 다른 웹 작업자를 생성 할 수 있습니다. 그러나 실제로 대부분의 브라우저는이를 금지합니다. 따라서 웹 작업자간에 의사 소통하는 유일한 방법은 기본 응용 프로그램을 통한 것입니다. 메시지를 통한 통신은 동시에 수행되므로 비동기식 (비 블로킹) 커뮤니케이션 만 수행됩니다. 처음에는 프로그래밍에서 이상 할 수 있지만 많은 장점을 제공합니다. 가장 중요한 것은 코드가 경주 조건이 없어야합니다! 백그라운드에서 소수 시퀀스를 계산하기 위해 시퀀스의 시작과 끝을 나타내는 두 매개 변수를 사용하는 간단한 예를 살펴 보겠습니다. 먼저 다음 내용이있는 Prime.js라는 파일을 만듭니다.
window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
이제, 우리는 백그라운드 작업자를 시작하기 위해 기본 응용 프로그램의 다음 코드를 사용하면됩니다.

꽤 많은 작업입니다. 특히 성가신 것은 다른 파일을 사용하는 것입니다. 이것은 좋은 분리를 만들어 내지 만 작은 작업에는 완전히 중복되는 것 같습니다. 다행히도 해결책이 있습니다. 다음 코드를 고려하십시오
onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}
물론, 우리는 그러한 마법 숫자 (13과 14)보다 더 나은 솔루션을 원할 수 있으며 브라우저에 따라 Blob 및 CreateObjecturl의 폴백을 사용해야합니다. JavaScript 전문가가 아닌 경우 fs.substr (13, fs.length -14)는 기능 본문을 추출하는 것입니다. 함수 선언을 문자열로 변환하고 (toString ()로 호출)과 함수 자체의 서명을 제거함으로써이를 수행합니다.

병렬 js가 도움이 될 수 있습니까?

이것은 ParallelJS가 시작되는 곳입니다. 웹 워커뿐만 아니라 편의성을위한 멋진 API를 제공합니다. 여기에는 많은 보조 도구와 매우 유용한 추상화가 포함됩니다. 먼저 처리 할 데이터를 제공합니다.
if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}

데이터 필드는 제공된 배열을 생성합니다. "병렬"작업이 아직 호출되지 않았습니다. 그러나 인스턴스 P에는 Spawn과 같은 일련의 메소드가 포함되어 있으며 새로운 웹 작업자가 생성됩니다. 그것은 약속을 반환하여 결과를 산들 바람으로 만듭니다.
var fs = (function () { 
    /* code for the worker */ 
}).toString(); 
var blob = new Blob(
   [fs.substr(13, fs.length - 14)],
   { type: 'text/javascript' }
);
var url = window.URL.createObjectURL(blob);
var worker = new Worker(url);
// Now setup communication and rest as before
window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
위 코드의 문제는 계산이 실제로 평행하지 않다는 것입니다. 전체 데이터 배열을 한 번에 처리하는 단일 배경 작업자 만 만듭니다. 전체 배열을 처리 한 후에 만 ​​결과를 얻을 수 있습니다. 더 나은 솔루션은 병렬 인스턴스의 맵 함수를 사용하는 것입니다.

이전 예에서 코어는 매우 간단하고 너무 간단 할 수 있습니다. 실제 예에서는 많은 운영 및 기능이 관련 될 것입니다. 요구 기능을 사용하여 가져온 기능을 포함 할 수 있습니다.
onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}

기능 감소 기능은 단편화 된 결과를 단일 결과로 집계하는 데 도움이됩니다. 모든 하위 성분을 알고 난 후에 해당 변수를 수집하고 특정 작업을 수행하기위한 편리한 추상화를 제공합니다.

if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}
결론 ParallelJS는 웹 워커를 사용할 때 발생할 수있는 문제를 피할 수있는 우아한 방법을 제공합니다. 또한 유용한 추상화와 도우미가있는 멋진 API를 얻습니다. 향후 추가 개선이 통합 될 수 있습니다. JavaScript에서 SMT를 사용할 수있는 것 외에도 벡터화를 사용할 수도 있습니다. 지원되면 simd.js는 실행 가능한 접근 방식 인 것 같습니다. 일부 (희망적으로 그리 멀지 않은) 선물에서는 컴퓨팅에 GPU를 사용하는 것도 유효한 옵션 일 수 있습니다. Node.js에는 Cuda (병렬 컴퓨팅 아키텍처) 용 래퍼가 있지만 원래 JavaScript 코드는 여전히 불가능합니다. 그때까지 ParallelJS는 장기 실행 컴퓨팅을 처리하기 위해 멀티 코어 CPU를 활용하는 최선의 선택이었습니다. 당신은요? JavaScript를 사용하여 최신 하드웨어의 전력을 발휘하는 방법은 무엇입니까?

paralleljs 를 가진 병렬 js의 faqs (faq) 평행은 무엇이며 어떻게 작동합니까?

ParallelJS는 멀티 코어 프로세서를 활용하여 데이터 처리를 병렬화 할 수있는 JavaScript 라이브러리입니다. 새로운 병렬 객체를 만들고 데이터 배열을 전달하여 작동합니다. 그런 다음이 데이터는 배열의 각 항목에 지정된 함수를 적용하는 메소드를 사용하여 병렬로 처리 될 수 있습니다. 그런 다음 결과를 새 배열로 반환하십시오.

ParallelJS를 설치하는 방법은 무엇입니까?

ParallelJS는 NPM (Node.js Package Manager)을 사용하여 설치할 수 있습니다. 터미널에서 "npm install paralleljs"명령을 실행하기 만하면됩니다. 설치가 완료되면 "var parallel = require ( 'parallentjs');

병렬 js를 사용하면 어떤 이점이 있습니까?

ParallelJS를 사용하면 멀티 코어 프로세서를 사용하여 데이터 처리 작업을 최대한 활용할 수 있습니다. 이것은 대규모 데이터 세트에서 처리 시간을 크게 높일 수 있습니다. 또한 병렬화 코드를 쉽게 만드는 간단하고 직관적 인 API를 제공합니다.

내 브라우저에서 ParallelJS를 사용할 수 있습니까?

예, ParallelJS는 브라우저에서 사용할 수 있습니다. 스크립트 태그와 병렬 js 파일의 URL을 사용하여 HTML 파일에 포함시킬 수 있습니다. 포함되면 node.js와 같이 병렬 객체를 사용할 수 있습니다.

병렬 js에서

메소드를 사용하는 방법은 무엇입니까? .map()

ParallelJS의

메소드는 데이터 배열의 각 항목에 함수를 적용하는 데 사용됩니다. 이 함수는 .map() 메소드에 문자열로 전달됩니다. 그런 다음 결과를 새 배열로 반환하십시오. 예를 들어, "var p = 새로운 병렬 ([1, 2, 3]); p.map ( 'function (n) {return n * 2;}');" ] 새로운 배열. .map() 병렬 js의

메소드는 무엇입니까?

.reduce() ParallelJS의

메소드는 지정된 함수를 사용하여 데이터 배열을 단일 값으로 줄이는 데 사용됩니다. 이 함수는

메소드에 문자열로 전달됩니다. 예를 들어, "var p = 새로운 병렬 ([1, 2, 3]); p.reduce ( 'function (a, b) {return a b;}');" .reduce() 병렬로 메소드를 연결할 수 있습니까? .reduce() 예, ParallelJS의 메소드를 서로 연결할 수 있습니다. 예를 들어, 메소드를 사용하여 데이터를 처리 한 다음

메소드를 사용하여 결과를 단일 값으로 결합 할 수 있습니다.

병렬로 오류를 처리하는 방법은?

평행의 오류는 메소드를 사용하여 처리 할 수 ​​있습니다. 이 메소드는 처리 중에 오류가 발생하면 호출되는 함수를 허용합니다. 오류 객체 가이 함수로 전달됩니다.

다른 JavaScript 라이브러리와 함께 병렬 js를 사용할 수 있습니까? .map() 예, ParallelJS는 다른 JavaScript 라이브러리와 함께 사용할 수 있습니다. 그러나 .reduce() 메소드를 사용하여 작업자 컨텍스트에 라이브러리를 포함시켜야합니다.

ParallelJS는 모든 데이터 처리 작업에 적합합니까?

ParallelJS는 대규모 데이터 세트에서 처리 시간을 크게 높일 수 있지만 모든 작업에 가장 적합한 선택은 아닐 수 있습니다. 소규모 데이터 세트의 경우 작업자 생성 및 데이터 전송의 오버 헤드가 병렬화의 이점을 능가 할 수 있습니다. 특정 사용 사례를 사용하여 병렬 JS를 테스트하여 성능 장점을 제공하는지 확인하는 것이 좋습니다.

위 내용은 병렬 js와 병렬 자바 스크립트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.