html5 web workers

Post on 01-Jul-2015

306 Views

Category:

Software

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

HTML5 Web Workers 발표자료 입니다.

TRANSCRIPT

HTML5 Web Workers

NHN NEXT 김우진

Web Worker는 Thread다.

Link : http://pmav.eu/stuff/javascript-webworkers/

THREAD

용도

긴 시간이 걸리는 스크립트

수식계산,

Serialization, Deserialization,

정렬,

Normalization,

등등

그래픽 작업UI는 그림만 그리고

복잡한 계산은 워커에게!

Example : Ray Tracing

Link : http://nerget.com/rayjs-mt/rayjs.html

미디어 작업

Motion Detection,

Image Filter,

Audio Analysis,

등등

Live Syntax Highlighting

public class Man {String name;Integer age;

public Man(String name, Integer age) {this.name = name;this.age = age;

}

public void know(String name, int age) {this.name = name;this.age = age;

}}

그 외

채팅구현,

Spell checker,

AJAX 요청,

WebSocket,

등등

졸라좋당.

사용법

Check Web Worker Support

// In UI Threadif(typeof(Worker) !== "undefined") { // Yes! Web worker support! // Some code…} else { // Sorry! No Web Worker support…}

Web Worker Support

Worker 만들기

// In UI Threadvar workerGary = new Worker("gary-in-IHU.js");

Worker를 일하게 하기

// In UI ThreadworkerGary.postMessage("Ride a skateboard");

참고 : postMessage의 인자는 어떤 type이든 JSON Object로 처리된다.

Worker 코드

// In Worker Thread - gary-in-IHU.jsonmessage = function(e) {

if(e.data === "Ride a skateboard") {rideSkateBoard();

};};

Worker 코드

// In Worker Thread - gary-in-IHU.jsfunction rideSkateBoard () {

doAli();doHeadSpin();doSometingDifficult();doSometingDangerous();postMessage("Let’s eat ramen");

};

결과를 가져오기

// In UI ThreadworkerGary.onmessage = function(e) {

// The message from the worker : if(e.data === "Let’s eat ramen") {

// Go to IHU and eat ramen…};

};

정리

Worker.postMessage(data);

Worker.onmessage() handler

self.onmessage() handler

self.postmessage(data);

UI Thread Worker Thread

참 쉽죠?

Helpful Tips

// In Worker Threadfunction callUi () {

postMessage({'cmd': methodName, 'args': args});};

// In UI Threadworker.onmessage = function(e) {

var fn = window[e.data.cmd];fn(e.data.args);

};

UI Thread의 함수 호출하기.

Helpful Tips

// In Worker Thread// logging from within the workerfunction log (obj) {

callUi({'cmd': 'console.log', 'args': obj});};

Worker Thread에서 로그 찍기.

Helpful Tips

<script id="worker1" type="javascript/worker">// Worker Thread

</script><script>

// UI Threadvar blob = new Blob([

document.querySelector('#worker1').textContent], { type: "text/javascript" });

var worker = new Worker(window.URL.createObjectURL(blob));// Working Hard

</script>

한 파일 안에서 워커 만들기.(Blob Object 이용)

for Chrome 8+, Firefox 6+, Safari 6.0+, Opera 15+

Import Scripts

// In Worker ThreadimportScript('workerUtil.js', 'jquery.hive.pollen.js');

Finishing Work

// In Worker Threadself.close();

or

// In UI Threadworker.terminate();

참고

할 수 없는 것

DOM 조작,

전역변수 사용,

jquery 사용,

debugger

할 수 있는 것Javascript 객체 사용,

Navigator Object 사용,

Location Object 사용(Read Only),

Ajax,

setTimeout, setInterval,

underscore.js 사용,

jquery.hive.pollen.js 사용

Shared Worker

Web Worker

1 : 1

Shared Worker

Many : Many

UI Thread : Worker Thread

Link : http://coolaj86.github.io/html5-shared-web-worker-examples/

Shared Worker

Shared Worker

Many : Many

portUI Thread

Shared Worker Thread

Shared Worker Thread

Shared Worker Thread

Shared Worker Thread

Shared Worker Thread

참고 : Shared Worker끼린 전역공간을 공유한다.

Shared Worker 만들기

// In UI Thread// SharedWorker(file, name)var sWorker = new SharedWorker("sWorker.js", "a");

Shared Worker 또 만들기

// In UI Thread// SharedWorker(file, name)var sWorker = new SharedWorker("sWorker.js", "a");var sWorker2 = new SharedWorker("sWorker.js", "a");// 같은 Javascript파일을 같은 name에 여러개 연결 할 수 있다.// 하나의 포트에 전역공간을 공유하는 worker 2개가 연결되었다.

주의사항

// 가능var sWorker = new SharedWorker("sWorker.js", "a");var sWorker2 = new SharedWorker("sWorker.js", "b");

// 불가능 : 같은 파일만 같은 name에 연결 할 수 있다.var sWorker = new SharedWorker("sWorker.js", "a");var sWorker2 = new SharedWorker("sWorker2.js", "a");

일하게 하기

// In UI ThreadsWorker.port.postMessage("Worker 1");sWorker2.port.postMessage("Worker 2");

Shared Worker 코드

// sWorker.jsvar global = 0;self.onconnect = function(e) {

global++;var port = e.ports[0];port.onmessage = function(e) {

port.postMessage(e.data + " " + global);};

};

결과를 가져오기

// In UI Threadvar messageHandler = function(e) {

console.log(e.data);};

sWorker.port.onMessage = messageHandler;sWorker2.port.onMessage = messageHandler;

결과는?

Shared Worker Example

Worker 1 : 2Worker 2 : 2

Shared Worker Support

복습

// In UI Threadvar worker = new Worker(“worker.js");worker.postMessageworker.onmessageworker.terminate

// In Worker Threadself.postMessageself.onmessageself.closeimportScript(…);

이제 직접 해볼까요?

미션1

워커에게 1초에 한번씩 숫자 세달라고 하기.http://jsbin.com/doxaveza/1/edit

결과

worker : 1worker : 2worker : 3worker : 4

.

.

.

미션2

워커와 한번씩 번갈아 가면서 숫자세기.

결과

worker : 1me : 2

worker : 3me : 4

.

.

.

Q & A

Reference

http://www.slideshare.net/humblefrog/getting-started-with-html-5-web-workers

https://developer.mozilla.org/ko/docs/Web/Guide/Performance/Using_web_workers

http://www.w3schools.com/html/html5_webworkers.asp

http://caniuse.com

http://www.htmlgoodies.com/html5/other/html5-tech-shared-web-workers-help-

spread-the-news.html#fbid=vbuGMC1zVWY

top related