1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
---
title: SharedWorker
slug: Web/API/SharedWorker
translation_of: Web/API/SharedWorker
---
<div>{{APIRef("Web Workers API")}}</div>
<p><code><strong>SharedWorker</strong></code><strong> </strong>인터페이스는 윈도우 창이나 iframe, 워커등의 다른 브라우징 컨텍스트에서도 접근이 가능한 특정 종류의 워커를 의미합니다. 기존의 다른 종류의 워커들과 다른 전역 스코프를 갖는 인터페이스를 구현합니다. {{domxref("SharedWorkerGlobalScope")}}.</p>
<div class="note">
<p><strong>참고 : </strong> SharedWorker 가 몇개의 다른 브라우징 컨텍스트에서 접근이 가능하면, 그 브라우징 컨텍스트들은 모두 정확히 같은 오리진을 공유해야 합니다. (같은 프로토콜, 호스트, 포트 등)</p>
</div>
<h2 id="생성자">생성자</h2>
<dl>
<dt>{{domxref("SharedWorker.SharedWorker", "SharedWorker()")}}</dt>
<dd>특정 URL에서 스크립트를 실행하는 shared web worker를 생성합니다.</dd>
</dl>
<h2 id="속성">속성</h2>
<p><em>{{domxref("EventTarget")}}</em> 의 속성들을 상속 받습니다. 그리고 <em>{{domxref("AbstractWorker")}} </em>의 속성들을 구현할 수 있습니다.</p>
<dl>
<dt>{{domxref("AbstractWorker.onerror")}}</dt>
<dd>워커에서 {{domxref("ErrorEvent")}} 타입의 에러가 발생했을 때 호출되는는 {{domxref("EventListener")}}</dd>
<dt>{{domxref("SharedWorker.port")}} {{readonlyInline}}</dt>
<dd>shared worker를 제어하거나 통신하기 위해 사용되는 {{domxref("MessagePort")}} 객체를 반환</dd>
</dl>
<h2 id="메서드">메서드</h2>
<p><em>{{domxref("EventTarget")}}</em> 의 속성들을 상속 받습니다. 그리고 <em>{{domxref("AbstractWorker")}} </em>의 속성들을 구현할 수 있습니다.</p>
<h2 id="예제">예제</h2>
<p><a class="external external-icon" href="https://github.com/mdn/simple-shared-worker">Basic shared worker example</a> (<a class="external external-icon" href="http://mdn.github.io/simple-shared-worker/">run shared worker</a>) 를 보시면 2개의 HTML 페이지가 있습니다. 각각 간단한 계산을 위해 자바스크립트를 사용합니다. 각기 다른 스크립트가 계산을 위해 같은 워커 파일을 사용합니다 — 두 개 페이지가 모두 다른 윈도우창에서 실행되더라도 같은 워커에 접근할 수 있습니다.</p>
<p>아래 코드 스니펫은 {{domxref("SharedWorker.SharedWorker", "SharedWorker()")}} 생성자를 이용해 <code>SharedWorker</code> 객체를 생성합니다. 두 스크립트 모두 아래를 포함합니다.</p>
<pre class="brush: js">var myWorker = new SharedWorker("worker.js");
</pre>
<p>두 스크립트는 {{domxref("SharedWorker.port")}} 속성으로 생성한 {{domxref("MessagePort")}} 객체를 통해 워커에 접근할 수 있습니다. <code>addEventListener</code> 를 이용하여 <code>onmessage</code> 가 추가되면, port는 <code>start()</code> 메서드를 이용하여 수동으로 시작할 수 있습니다.</p>
<pre class="brush: js">myWorker.port.start();</pre>
<p>포트가 시작되면, 양 스크립트는 워커에 메시지를 보내고 <code>port.postMessage()</code>와 <code>port.onmessage</code> 를 각각 이용하여 메시지를 처리합니다.</p>
<pre class="brush: js">first.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('Message posted to worker');
}
second.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('Message posted to worker');
}
myWorker.port.onmessage = function(e) {
result1.textContent = e.data;
console.log('Message received from worker');
}</pre>
<p>워커에서 {{domxref("SharedWorkerGlobalScope.onconnect")}} 핸들러를 이용하여 위에 언급된 포트에 접속할 수 있습니다. 워커에 연관되어 있는 포트는 {{event("connect")}} 이벤트 포트 속성에 접근할 수 있습니다 — 그리고나서 {{domxref("MessagePort")}} <code>start()</code> 메서드로 포트를 시작하고, onmessage 핸들러로 메인쓰레드에서 받은 메시지를 처리합니다.</p>
<pre class="brush: js">onconnect = function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
port.postMessage(workerResult);
});
port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
}</pre>
<h2 id="명세">명세</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
<tr>
<td>{{SpecName('HTML WHATWG', "#sharedworker", "SharedWorker")}}</td>
<td>{{Spec2('HTML WHATWG')}}</td>
<td>No change from {{SpecName("Web Workers")}}.</td>
</tr>
</tbody>
</table>
<h2 id="브라우저_호환성">브라우저 호환성</h2>
<p>{{Compat("api.SharedWorker")}}</p>
<h2 id="같이_보기">같이 보기</h2>
<ul>
<li>{{domxref("Worker")}}</li>
<li><a class="internal" href="/en-US/docs/Web/Guide/Performance/Using_web_workers">Using web workers</a></li>
</ul>
|