문제

고의적인 디자인 결정입니까, 아니면 향후 버전에서 수정될 현재 브라우저의 문제입니까?

도움이 되었습니까?

해결책

브라우저의 JavaScript 인터프리터는 단일 스레드(AFAIK)이므로 JavaScript는 멀티스레딩을 지원하지 않습니다.Google Chrome조차도 단일 웹페이지의 JavaScript가 동시에 실행되는 것을 허용하지 않습니다. 이는 기존 웹페이지에 엄청난 동시성 문제를 일으킬 수 있기 때문입니다.Chrome이 하는 일은 여러 구성 요소(다른 탭, 플러그인 등)를 별도의 프로세스로 분리하는 것뿐입니다. 하지만 단일 페이지에 두 개 이상의 JavaScript 스레드가 있는 것은 상상할 수 없습니다.

그러나 제안한 대로 다음을 사용할 수 있습니다. setTimeout 일종의 스케줄링과 "가짜" 동시성을 허용합니다.이로 인해 브라우저는 렌더링 스레드에 대한 제어권을 다시 획득하고 제공된 JavaScript 코드를 시작합니다. setTimeout 지정된 밀리초 후에.이는 작업을 수행하는 동안 뷰포트(표시되는 내용)를 새로 고치려는 경우 매우 유용합니다.예를 들어 그냥 반복합니다.그에 따라 요소를 좌표화하고 업데이트하면 시작 위치와 끝 위치만 볼 수 있으며 그 사이에는 아무 것도 표시되지 않습니다.

우리는 동일한 JavaScript 인터프리터에 의해 모두 관리되는 프로세스와 스레드를 생성할 수 있는 JavaScript의 추상화 라이브러리를 사용합니다.이를 통해 다음과 같은 방식으로 작업을 실행할 수 있습니다.

  • 프로세스 A, 스레드 1
  • 프로세스 A, 스레드 2
  • 프로세스 B, 스레드 1
  • 프로세스 A, 스레드 3
  • 프로세스 A, 스레드 4
  • 프로세스 B, 스레드 2
  • 프로세스 A를 일시 중지합니다.
  • 프로세스 B, 스레드 3
  • 프로세스 B, 스레드 4
  • 프로세스 B, 스레드 5
  • 프로세스 A 시작
  • 프로세스 A, 스레드 5

이는 일정 형태의 스케줄링을 허용하고 병렬성, 스레드 시작 및 중지 등을 위조하지만 진정한 멀티스레딩은 아닙니다.진정한 멀티스레딩은 브라우저가 단일 페이지 멀티스레딩(또는 둘 이상의 코어)을 실행할 수 있는 경우에만 유용하기 때문에 언어 자체에서는 이것이 구현되지 않을 것이라고 생각합니다. 추가 가능성보다.

JavaScript의 미래를 알아보려면 다음을 확인하세요.https://developer.mozilla.org/presentations/xtech2006/javascript/

다른 팁

전통적으로 JS는 짧고 빠르게 실행되는 코드 조각을 위해 만들어졌습니다.주요 계산을 진행 중이라면 서버에서 수행한 것입니다. JS+HTML의 아이디어입니다. 사소하지 않은 일을 하면서 오랜 시간 동안 브라우저에서 실행되는 것은 터무니없는 일이었습니다.

물론, 이제 우리는 그것을 가지고 있습니다.그러나 브라우저가 따라잡는 데는 약간의 시간이 걸릴 것입니다. 대부분은 단일 스레드 모델을 중심으로 설계되었으며 이를 변경하는 것은 쉽지 않습니다.Google Gears는 백그라운드 실행을 격리하도록 요구함으로써 많은 잠재적인 문제를 회피합니다. DOM을 변경하지 않고(스레드로부터 안전하지 않기 때문에) 메인 스레드에서 생성된 객체에 액세스하지 않습니다(동일함).제한적이긴 하지만 이는 브라우저 디자인을 단순화하고 경험이 부족한 JS 코더가 스레드를 조작하는 것과 관련된 위험을 줄여주기 때문에 가까운 미래에 가장 실용적인 디자인이 될 것입니다.

@마르시오:

이것이 Javascript에서 멀티스레딩을 구현하지 않는 이유입니까?프로그래머는 자신이 가지고 있는 도구를 사용하여 원하는 것은 무엇이든 할 수 있습니다.

그렇다면 그들에게 그렇게 쉬운 도구를 주지 말자. 오용 내가 여는 다른 모든 웹사이트는 결국 내 브라우저를 다운시킵니다.이를 순진하게 구현하면 IE7 개발 중에 MS가 많은 골치 아픈 문제를 일으킨 영역으로 바로 들어갈 수 있습니다.애드온 작성자는 스레딩 모델을 빠르고 느슨하게 사용하여 기본 스레드에서 개체 수명 주기가 변경될 때 숨겨진 버그가 분명해졌습니다.나쁜.IE용 멀티스레드 ActiveX 추가 기능을 작성하고 있다면 해당 기능도 함께 제공될 것입니다.그렇다고 그 이상으로 나아갈 필요가 있다는 의미는 아닙니다.

JavaScript 멀티스레딩(일부 제한 있음)이 여기에 있습니다.Google은 Gears용 작업자를 구현했으며 작업자는 HTML5에 포함됩니다.대부분의 브라우저에는 이미 이 기능에 대한 지원이 추가되었습니다.

작업자와 통신하는 모든 데이터는 직렬화/복사되므로 데이터의 스레드 안전성이 보장됩니다.

자세한 내용은 다음을 참조하세요.

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

이 결정에 대한 근거는 모르지만 setTimeout을 사용하면 다중 스레드 프로그래밍의 이점 중 일부를 시뮬레이션할 수 있다는 것을 알고 있습니다.여러 프로세스가 동시에 작업을 수행하는 것처럼 보일 수 있지만 실제로는 모든 작업이 하나의 스레드에서 발생합니다.

함수가 약간의 작업을 수행하도록 한 다음 다음과 같이 호출하세요.

setTimeout(function () {
    ... do the rest of the work...
}, 0);

그리고 UI 업데이트, 애니메이션 이미지 등 수행해야 할 다른 작업은 기회가 있을 때 수행됩니다.

멀티스레드.js Web Workers를 래핑하고 JS에서 쉽게 멀티스레딩을 허용합니다.iOS Safari를 포함한 모든 새로운 브라우저에서 작동합니다.:)

언어가 멀티스레딩을 지원하지 않는 이유 또는 브라우저의 JavaScript 엔진이 멀티스레딩을 지원하지 않는 이유는 무엇입니까?

첫 번째 질문에 대한 대답은 브라우저의 JavaScript는 샌드박스에서 시스템/OS 독립적인 방식으로 실행되도록 되어 있기 때문에 멀티스레딩 지원을 추가하면 언어가 복잡해지고 언어가 OS에 너무 밀접하게 연결된다는 것입니다.

matt b가 말했듯이 질문은 명확하지 않습니다.언어의 멀티스레딩 지원에 대해 문의한다고 가정해 보겠습니다.현재 브라우저에서 실행 중인 애플리케이션의 99.999%에는 필요하지 않기 때문입니다.정말로 필요한 경우 해결 방법이 있습니다(예: window.setTimeout 사용).

일반적으로 멀티스레딩은 추가 제한 사항(불변 데이터만 사용하는 것과 같은)을 추가하지 않는 한 올바르게 수행하기가 매우, 매우, 매우, 매우, 매우, 매우 어렵습니다(내가 어렵다고 말했나요?).

Intel은 Javascript의 멀티스레딩에 대한 오픈 소스 연구를 진행해 왔으며 최근 GDC 2012에서 공개되었습니다.다음은 해당 링크입니다. 동영상.연구팀은 주로 Intel 칩셋과 Windows OS에 초점을 맞춘 OpenCL을 사용했습니다.프로젝트의 코드명은 RiverTrail이며 코드는 GitHub에서 사용할 수 있습니다.

좀 더 유용한 링크:

웹 애플리케이션을 위한 컴퓨팅 하이웨이 구축

현재 일부 브라우저는 멀티스레딩을 지원합니다.따라서 필요한 경우 특정 라이브러리를 사용할 수 있습니다.예를 들어 다음 자료를 확인하세요.

Node.js 10.5 이상 지원 작업자 스레드 실험적인 기능으로(다음과 함께 사용할 수 있습니다. --실험 작업자 플래그 활성화됨): https://nodejs.org/api/worker_threads.html

따라서 규칙은 다음과 같습니다.

  • 당신이해야 할 경우 I/O 바운드 작업, 내부 메커니즘(콜백/약속/비동기 대기라고도 함)을 사용합니다.
  • 당신이해야 할 경우 CPU 바인딩된 작업, 작업자 스레드를 사용하십시오.

작업자 스레드는 수명이 긴 스레드로 만들어졌습니다. 즉, 백그라운드 스레드를 생성한 다음 메시지 전달을 통해 통신합니다.

그렇지 않고 익명 함수를 사용하여 과도한 CPU 로드를 실행해야 하는 경우 다음을 사용할 수 있습니다. https://github.com/wilk/microjob, 작업자 스레드를 중심으로 구축된 작은 라이브러리입니다.

멀티스레딩을 지원하지 않는 구현입니다.현재 Google Gears는 외부 프로세스를 실행하여 일종의 동시성을 사용하는 방법을 제공하고 있지만 그게 전부입니다.

구글이 오늘 출시할 새 브라우저(구글 크롬)는 일부 코드를 프로세스에서 분리해 병렬로 실행한다.

물론 핵심 언어는 Java와 동일한 지원을 가질 수 있지만 Erlang의 동시성 같은 것에 대한 지원은 거의 불가능합니다.

내가 들은 바로는 Google Chrome에 멀티스레드 자바스크립트가 있을 것이므로 이는 "현재 구현" 문제입니다.

에 따르면 이 기사 JavaScript 스레딩을 구현하는 것은 이미 가능합니다.

스레드 동기화를 위한 적절한 언어 지원이 없으면 새로운 구현을 시도하는 것도 의미가 없습니다.기존의 복잡한 JS 앱(예:ExtJS를 사용하는 모든 것)은 예기치 않게 충돌할 가능성이 높지만 synchronized 키워드나 이와 유사한 것을 사용하면 올바르게 작동하는 새 프로그램을 작성하는 것도 매우 어렵거나 심지어 불가능할 수도 있습니다.

그러나 eval 함수를 사용하여 어느 정도 동시성을 확보할 수 있습니다.

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}

jetworker, webworker의 래퍼를 사용할 수 있습니다https://github.com/uxitten/jetworker

HTML5가 제공하는 웹워커를 사용하면 자바스크립트를 사용한 멀티스레딩이 분명히 가능합니다.

웹 워커와 표준 멀티스레딩 환경의 주요 차이점은 메모리 리소스가 메인 스레드와 공유되지 않고 개체에 대한 참조가 한 스레드에서 다른 스레드로 표시되지 않는다는 것입니다.스레드는 메시지 교환을 통해 통신하므로 이벤트 중심 디자인 패턴에 따라 동기화 및 동시 메서드 호출 알고리즘을 구현하는 것이 가능합니다.

스레드 간 프로그래밍을 구조화할 수 있는 많은 프레임워크가 존재하며, 그중 동시 프로그래밍을 지원하는 OOP js 프레임워크인 OODK-JS가 있습니다.https://github.com/GOMServices/oodk-js-oop-for-js

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top