JavaScript가 멀티 스레딩을 지원하지 않는 이유는 무엇입니까?
향후 버전에서 수정 될 현재 브라우저에 대한 의도적 인 디자인 결정 또는 문제입니까?
브라우저의 JavaScript 인터프리터는 단일 스레드 (AFAIK)이므로 JavaScript는 멀티 스레딩을 지원하지 않습니다. Chrome에서도 단일 웹 페이지의 JavaScript를 동시에 실행할 수 없으므로 기존 웹 페이지에서 동시성 문제가 발생할 수 있습니다. 모든 Chrome은 여러 구성 요소 (다른 탭, 플러그인 등)를 별도의 프로세스로 분리하지만 JavaScript 스레드가 두 개 이상인 단일 페이지를 상상할 수는 없습니다.
그러나 제안 된대로 setTimeout
일정 예약 및 "가짜"동시성을 허용하기 위해 사용할 수 있습니다 . 이로 인해 브라우저는 렌더링 스레드를 다시 제어 setTimeout
하고 지정된 밀리 초 후에 제공된 JavaScript 코드를 시작합니다 . 뷰포트 (조회 한 것)가 작업을 수행하는 동안 새로 고치도록하려는 경우에 매우 유용합니다. 예를 들어 좌표를 반복하고 그에 따라 요소를 업데이트하면 시작 및 끝 위치를 볼 수 있으며 그 사이에는 아무것도 없습니다.
우리는 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 (스레드에 안전하지 않기 때문에)을 변경하지 않고 메인 스레드 (ditto)로 생성 된 개체에 액세스하지 않아도되므로 많은 잠재적 인 문제를 회피합니다. 제한적이지만 브라우저의 디자인을 단순화하고 경험이 부족한 JS 코더가 스레드로 엉망이되는 위험을 줄임으로써 가까운 장래에 가장 실용적인 디자인 일 것입니다 ...
@marcio :
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 업데이트, 애니메이션 이미지 등과 같은 기타 필요한 작업은 기회가있을 때 발생합니다.
언어가 멀티 스레딩을 지원하지 않는 이유 또는 브라우저의 JavaScript 엔진이 멀티 스레딩을 지원하지 않는 이유는 무엇입니까?
첫 번째 질문에 대한 답변은 브라우저의 JavaScript가 샌드 박스와 머신 / OS 독립적 인 방식으로 실행되도록되어 있으며 멀티 스레딩 지원을 추가하면 언어가 복잡해지고 언어가 OS에 너무 밀접하게 연결될 수 있습니다.
matt b가 말했듯이 질문은 분명하지 않습니다. 언어로 멀티 스레딩 지원을 요청한다고 가정하면 : 현재 브라우저에서 실행중인 응용 프로그램의 99.999 %가 필요하지 않기 때문입니다. 실제로 필요한 경우 해결 방법이 있습니다 (예 : window.setTimeout 사용).
일반적으로 멀티 스레딩은 불변의 데이터 만 사용하는 것과 같은 추가 제한을 두지 않는 한 올바르게 달성하기가 매우 어렵습니다.
인텔은 Javascript의 멀티 스레딩에 대한 오픈 소스 연구를 진행하고 있으며, 최근 GDC 2012에서 소개되었습니다. 비디오 링크는 다음과 같습니다 . 이 연구 그룹은 OpenCL을 사용했으며 주로 Intel 칩셋 및 Windows OS에 중점을 둡니다. 이 프로젝트의 이름은 RiverTrail이며 코드는 GitHub에서 사용할 수 있습니다.
더 유용한 링크들 :
Node.js 10.5+는 작업자 스레드 를 실험 기능으로 지원 합니다 ( --experimental-worker 플래그가 활성화 된 상태에서 사용할 수 있음) : https://nodejs.org/api/worker_threads.html
따라서 규칙은 다음과 같습니다.
- I / O 바운드 ops 를 수행해야하는 경우 내부 메커니즘 (일명 콜백 / 프로 미스 / async-await)을 사용하십시오.
- CPU 바운드 ops 를 수행해야하는 경우 작업자 스레드를 사용하십시오.
워커 스레드는 수명이 긴 스레드를 의미하며 백그라운드 스레드를 생성 한 다음 메시지 전달을 통해 통신합니다.
그렇지 않으면 익명 함수로 많은 CPU로드를 실행해야하는 경우 작업자 스레드를 중심으로 구축 된 작은 라이브러리 인 https://github.com/wilk/microjob 을 사용할 수 있습니다 .
현재 일부 브라우저는 멀티 스레딩을 지원합니다. 따라서 필요한 경우 특정 라이브러리를 사용할 수 있습니다. 예를 들어 다음 자료를보십시오.
멀티 스레딩을 지원하지 않는 구현입니다. 현재 Google Gears는 외부 프로세스를 실행하여 어떤 형태의 동시성을 사용할 수있는 방법을 제공하고 있습니다.
구글이 오늘 출시 할 새 브라우저 (구글 크롬)는 코드를 분리하여 병렬로 실행한다.
물론 핵심 언어는 Java와 같은 지원을 할 수 있지만 Erlang의 동시성과 같은 기능에 대한 지원은 거의 없습니다.
Chrome에서 멀티 스레드 자바 스크립트를 사용한다고 들었을 때 "현재 구현"문제입니다.
스레드 동기화에 대한 적절한 언어 지원이 없으면 새로운 구현을 시도하는 것도 의미가 없습니다. 기존의 복잡한 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;
}
}
HTML5로 가져온 웹 워커를 사용하면 자바 스크립트를 사용한 멀티 스레딩이 가능합니다.
웹 작업자와 표준 멀티 스레딩 환경의 주요 차이점은 메모리 리소스가 기본 스레드와 공유되지 않으며 객체에 대한 참조가 한 스레드에서 다른 스레드로 표시되지 않는다는 것입니다. 스레드는 메시지를 교환하여 통신하므로 이벤트 중심 디자인 패턴에 따라 동기화 및 동시 메서드 호출 알고리즘을 구현할 수 있습니다.
스레드 사이에서 프로그래밍을 구조화 할 수있는 많은 프레임 워크가 존재하며, 그 중 동시 프로그래밍을 지원하는 OOP js 프레임 워크 인 OODK-JS https://github.com/GOMServices/oodk-js-oop-for-js
참고 URL : https://stackoverflow.com/questions/39879/why-doesnt-javascript-support-multithreading
'Programing' 카테고리의 다른 글
날짜 선택기 : 편집 텍스트를 클릭 할 때 날짜 선택기를 팝업하는 방법 (0) | 2020.04.05 |
---|---|
ActionBar 제목에서 사용자 정의 글꼴을 설정하는 방법은 무엇입니까? (0) | 2020.04.05 |
CSS를 사용하여 둥근 모서리 만들기 (0) | 2020.04.05 |
Github 프로젝트 내부의 검색 코드 (0) | 2020.04.05 |
공유 객체 (.so), 정적 라이브러리 (.a) 및 DLL (.so)의 차이점은 무엇입니까? (0) | 2020.04.05 |