문제

두 웹 작업자 사이에 변수를 공유 할 수있는 방법이 있습니까? (웹 작업자는 기본적으로 JavaScript의 스레드입니다)

C#과 같은 언어로 :

public static string message = "";
static void Main()
{
 message = "asdf";
 new Thread(mythread).Run();
}
public static void mythread()
{
 Console.WriteLine(message); //outputs "asdf"
}

나는 그것이 나쁜 예를 알고 있지만, JavaScript 애플리케이션에는 여러 스레드에 퍼질 수있는 무거운 계산을 수행하는 스레드가 있습니다 [배열 형태의 큰 데이터 덩어리가 있기 때문입니다. 배열의 모든 요소는 서로 독립적입니다. 다시 말해, 내 작업자 스레드는 잠금이나 그와 비슷한 것에 신경 쓰지 않아도됩니다.

두 스레드 사이의 변수를 "공유"하는 유일한 방법은 [프로토 타이핑을 통해] getter/setter를 만들고 postmessage/onmessage를 사용하는 것입니다. afaik에 JSON을 사용하려면

LocalStorage/Database는 교착 상태를 초래할 수 있기 때문에 HTML5 사양에서 벗어 났으므로 옵션이 아닙니다 [슬프게도] ...

내가 찾은 또 다른 가능성은 PHP를 사용하여 실제로 getVariable.php 및 setVariable.php 페이지를 갖는 것이 었습니다.이 페이지는 LocalStorage를 사용하여 ints/strings를 저장합니다. JSON ... 그리고 나중에 json.parse () 'd.

내가 아는 한, JavaScript 작업자 스레드는 메인 페이지 스레드에서 완전히 격리되어 있습니다.

사후 관리자는 작동하지만 느립니다.

도움이 되었습니까?

해결책

웹 직원은 고의적으로 공유하지 않습니다. 근로자의 모든 것은 다른 작업자와 브라우저의 페이지에서 완전히 숨겨져 있습니다. 근로자 사이에 비 "원자"값을 공유 할 수있는 방법이 있다면, 이러한 값의 의미론은 예측 가능한 결과와 함께 사용하기가 거의 불가능할 것입니다. 자, 하나 ~할 수 있었다 잠금 장치를 사용하는 방법으로 잠금을 소개합니다. 어느 정도는 잠금을 획득하고, 검사하고 값을 수정 한 다음 잠금을 해제 할 수 있습니다. 그러나 잠금 장치는 사용하기가 매우 까다 롭고 일반적인 실패 모드는 교착 상태이기 때문에. 브라우저를 쉽게 "벽돌"할 수 있습니다. 개발자 나 사용자에게는 좋지 않습니다 (특히 스레드, 잠금 또는 메시지 통과에 대해 들어 본 적이없는 비 프로그램 자들에 의한 웹 환경이 실험에 적합하다고 생각할 때, 대안은 브라우저의 작업자 나 페이지간에 공유되는 상태가 아닙니다. 이러한 문제를 해결하지 않고도 메시지 (직렬화 된 "와이어를 통해"직렬화 된 "와이어를 통해"를 일련의 "와이어 위로"전달할 수있는 메시지를 전달할 수 있습니다.

실제로, 메시지 통과는 동시성 문제를 완전히 통제 할 수 없게하지 않고 병렬 처리를 지원하는 올바른 방법입니다. 메시지 핸드 오프를 올바르게 조정하면 상태를 공유 할 수있는 것처럼 모든 힘이 있어야합니다. 당신은 정말로 당신이 원하는 대안을 원하지 않습니다.

다른 팁

아니요,하지만 배열, 객체, 숫자, 문자열, 부울 및 이미지 데이터 또는 이들의 조합이 될 수있는 웹 작업자에게 메시지를 보낼 수 있습니다. 웹 작업자도 메시지를 다시 보낼 수 있습니다.

전용 근로자간에 데이터를 공유 할 수있는 두 가지 옵션이 있습니다.

1. 공유 노동자

SharedWorker 인터페이스는 여러 창, iframes 또는 작업자와 같은 여러 브라우징 컨텍스트에서 액세스 할 수있는 특정 종류의 작업자를 나타냅니다.

전용 근로자의 공유 근로자를 산란합니다

2. 채널 메시징 API

채널 메시징 API는 동일한 문서에 첨부 된 다른 브라우징 컨텍스트 (예 : 2 개의 iframes 또는 기본 문서 및 iframe, 공유 작업자를 통한 두 문서 또는 두 명의 직원을 통한 두 문서)에서 실행하는 두 개의 개별 스크립트를 허용하여 직접 통신하여 하나 사이에 메시지를 전달할 수 있습니다. 다른 쪽을 통해 양방향 채널 (또는 파이프)을 통해 각 끝에 포트가 있습니다.

웹 작업자로부터 공유 작업자에게 전화하는 방법은 무엇입니까?

나는 최근에 (그러나 사용하지 않았지만) 읽었습니다. 공유 노동자. 에 따르면 작업을 공유하십시오! 오페라에는 공유 작업자 지원이 제공됩니다, 지원은 최신 브라우저 (Opera 10.6, Chrome 5, Safari 5)에만 있습니다.

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