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/를 확인
하십시오.


답변

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

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

자세한 내용은 다음을 읽으십시오.

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

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


답변

전통적으로 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 업데이트, 애니메이션 이미지 등과 같은 기타 필요한 작업은 기회가있을 때 발생합니다.


답변

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

첫 번째 질문에 대한 답변은 브라우저의 JavaScript가 샌드 박스와 머신 / OS 독립적 인 방식으로 실행되도록되어 있으며 멀티 스레딩 지원을 추가하면 언어가 복잡해지고 언어가 OS에 너무 밀접하게 연결될 수 있습니다.


답변

Node.js 10.5+는 작업자 스레드 를 실험 기능으로 지원 합니다 ( –experimental-worker 플래그가 활성화 된 상태에서 사용할 수 있음). https://nodejs.org/api/worker_threads.html

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

  • I / O 바운드 작업 을 수행해야하는 경우 내부 메커니즘을 사용하십시오 (일명 콜백 / 프로 미스 / async-await).
  • CPU 바운드 ops 를 수행해야하는 경우 작업자 스레드를 사용하십시오.

워커 스레드는 수명이 긴 스레드이므로 백그라운드 스레드를 생성 한 다음 메시지 전달을 통해 통신합니다.

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


답변

matt b가 말했듯이 질문은 분명하지 않습니다. 언어로 멀티 스레딩 지원을 요청한다고 가정하면 : 현재 브라우저에서 실행중인 응용 프로그램의 99.999 %가 필요하지 않기 때문입니다. 실제로 필요한 경우 해결 방법이 있습니다 (예 : window.setTimeout 사용).

일반적으로 멀티 스레딩은 불변의 데이터 만 사용하는 것과 같은 추가 제한을 두지 않는 한 올바르게 달성하기가 매우 어렵습니다.