향후 버전에서 수정 될 현재 브라우저에 대한 의도적 인 설계 결정 또는 문제입니까?
향후 버전에서 수정 될 현재 브라우저에 대한 의도적 인 설계 결정 또는 문제입니까?
답변:
브라우저의 JavaScript 인터프리터는 단일 스레드 (AFAIK)이므로 JavaScript는 멀티 스레딩을 지원하지 않습니다. Chrome에서도 단일 웹 페이지의 JavaScript가 동시에 실행되지 않도록하면 기존 웹 페이지에서 대규모 동시성 문제가 발생할 수 있습니다. 모든 Chrome은 여러 구성 요소 (다른 탭, 플러그인 등)를 별도의 프로세스로 분리하지만 JavaScript 스레드가 두 개 이상인 단일 페이지를 상상할 수는 없습니다.
그러나 제안 된대로 setTimeout
일정과 "가짜"동시성을 허용하기 위해 사용할 수 있습니다 . 이로 인해 브라우저는 렌더링 스레드를 다시 제어 setTimeout
하고 지정된 밀리 초 후에 제공된 JavaScript 코드를 시작합니다 . 뷰포트 (조회 한 것)가 작업을 수행하는 동안 새로 고치도록하려는 경우에 매우 유용합니다. 예를 들어 좌표를 반복하고 그에 따라 요소를 업데이트하면 시작 및 끝 위치를 볼 수 있으며 그 사이에는 아무것도 없습니다.
우리는 JavaScript에서 추상화 라이브러리를 사용하여 동일한 JavaScript 인터프리터가 관리하는 프로세스와 스레드를 만들 수 있습니다. 이를 통해 다음과 같은 방식으로 작업을 실행할 수 있습니다.
이를 통해 일정 예약 및 가짜 병렬 처리, 스레드 시작 및 중지 등이 가능하지만 실제 멀티 스레딩은 아닙니다. 진정한 멀티 스레딩은 브라우저가 단일 페이지 멀티 스레드 (또는 하나 이상의 코어)를 실행할 수 있고 어려움이 더 큰 경우에만 유용하기 때문에 언어 자체로 구현 될 것이라고 생각하지 않습니다. 추가 가능성보다.
JavaScript의 미래에 대해서는 https://developer.mozilla.org/presentations/xtech2006/javascript/를 확인 하십시오.
JavaScript 멀티 스레딩 (일부 제한 사항)이 있습니다. Google은 Gears 작업자를 구현했으며 HTML5에 작업자가 포함되었습니다. 대부분의 브라우저는이 기능에 대한 지원을 이미 추가했습니다.
작업자와 통신하는 모든 데이터가 직렬화 / 복사되므로 데이터의 스레드 안전성이 보장됩니다.
자세한 내용은 다음을 읽으십시오.
전통적으로 JS는 짧고 빠르게 실행되는 코드 조각을위한 것이 었습니다. 주요 계산을 수행 한 경우 서버 에서 수행했습니다. 브라우저에서 오랫동안 실행 된 JS + HTML 앱 은 사소한 일을하지 않습니다.
물론, 지금 우리는 그것을 가지고 있습니다. 그러나 브라우저가 따라 잡는 데는 약간의 시간이 걸립니다. 대부분은 단일 스레드 모델을 중심으로 설계되었으며 변경하기는 쉽지 않습니다. Google Gears는 백그라운드 실행이 분리되어 DOM (스레드에 안전하지 않기 때문에)을 변경하지 않고 메인 스레드 (ditto)로 생성 된 개체에 액세스하지 않아도되므로 많은 잠재적 인 문제를 회피합니다. 제한적이지만 브라우저의 디자인을 단순화하고 경험이 부족한 JS 코더가 스레드로 엉망이되는 위험을 줄임으로써 가까운 장래에 가장 실용적인 디자인 일 것입니다 ...
@marcio :
Javascript에서 멀티 스레딩을 구현하지 않는 이유는 무엇입니까? 프로그래머는 원하는 도구를 사용하여 원하는대로 할 수 있습니다.
따라서 오용 하기 쉬운 도구를 제공하지 마십시오. 내가 연 다른 모든 웹 사이트에서 브라우저가 다운됩니다. 이것을 순진하게 구현하면 IE7 개발 중에 MS가 너무 많은 두통을 일으킨 영역으로 곧바로 들어올 수 있습니다. 추가 기능 작성자는 스레딩 모델에서 빠르고 느슨하게 재생되어 기본 스레드에서 객체 수명주기가 변경되면 숨겨진 버그가 발생했습니다. . 나쁜. IE 용 멀티 스레드 ActiveX 애드온을 작성하는 경우 영역과 함께 제공되는 것 같습니다. 그 이상으로 나아가 야한다는 의미는 아닙니다.
이 결정에 대한 이론적 근거는 모르지만 setTimeout을 사용하여 멀티 스레드 프로그래밍의 이점을 시뮬레이션 할 수 있다는 것을 알고 있습니다. 실제로는 모든 프로세스가 하나의 스레드에서 발생하지만 여러 프로세스가 동시에 작업을한다는 환상을 줄 수 있습니다.
함수가 약간의 작업을 수행하도록 한 다음 다음과 같이 호출하십시오.
setTimeout(function () {
... do the rest of the work...
}, 0);
그리고 UI 업데이트, 애니메이션 이미지 등과 같은 기타 필요한 작업은 기회가있을 때 발생합니다.
loop
내부 를 사용 하고 setTimeout
싶지만 분명히 작동하지 않습니다. 그런 일을 했습니까, 아니면 해킹을 했습니까? 예를 들어 1000 요소 배열의 setTimeout
경우 첫 번째 루프 스루 및 인쇄 요소 0..499
, 두 번째 루프 스루 및 인쇄 요소 가되도록 두 호출 내부에 두 개의 for 루프를 사용할 것으로 예상됩니다 500..999
.
Node.js 10.5+는 작업자 스레드 를 실험 기능으로 지원 합니다 ( --experimental-worker 플래그가 활성화 된 상태에서 사용할 수 있음). https://nodejs.org/api/worker_threads.html
따라서 규칙은 다음과 같습니다.
워커 스레드는 수명이 긴 스레드이므로 백그라운드 스레드를 생성 한 다음 메시지 전달을 통해 통신합니다.
그렇지 않으면 익명 함수로 과도한 CPU로드를 실행해야하는 경우 작업자 스레드를 중심으로 구축 된 작은 라이브러리 인 https://github.com/wilk/microjob 을 사용할 수 있습니다 .
인텔은 Javascript의 멀티 스레딩에 대한 오픈 소스 연구를 수행하고 있으며 최근 GDC 2012에서 소개되었습니다. 비디오 링크는 다음과 같습니다. . 이 연구 그룹은 OpenCL을 사용했으며 주로 Intel 칩셋 및 Windows OS에 중점을 둡니다. 이 프로젝트의 이름은 RiverTrail이며 코드는 GitHub에서 사용할 수 있습니다.
더 유용한 링크들 :
현재 일부 브라우저는 멀티 스레딩을 지원합니다. 따라서 필요한 경우 특정 라이브러리를 사용할 수 있습니다. 예를 들어 다음 자료를보십시오.
그러나 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;
}
}
HTML5로 가져온 웹 워커를 사용하면 자바 스크립트를 사용한 멀티 스레딩이 가능합니다.
웹 작업자와 표준 멀티 스레딩 환경의 주요 차이점은 메모리 리소스가 기본 스레드와 공유되지 않으며 객체에 대한 참조가 한 스레드에서 다른 스레드로 표시되지 않는다는 것입니다. 스레드는 메시지를 교환하여 통신하므로 이벤트 중심 디자인 패턴에 따라 동기화 및 동시 메서드 호출 알고리즘을 구현할 수 있습니다.
스레드 사이에서 프로그래밍을 구조화 할 수있는 많은 프레임 워크가 존재하며, 그 중 동시 프로그래밍을 지원하는 OOP js 프레임 워크 인 OODK-JS https://github.com/GOMServices/oodk-js-oop-for-js