2013 jsdc webworker
DESCRIPTION
隨著Web Application的發展,前端開發越來越複雜,多執行緒的需求也慢慢浮現,本議題主要介紹何謂Web Worker,到底能做到什麼,不能做到什麼,以及實際案例的分享。TRANSCRIPT
![Page 1: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/1.jpg)
Bingo2013/05/19
1
Web WorkerWhat the
Sunday, May 19, 13
![Page 2: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/2.jpg)
About Me
• front-end Engineer at
• http://blog.blackbing.net
• https://www.facebook.com/blackbing
2
Sunday, May 19, 13
![Page 3: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/3.jpg)
Hello Web Worker
3
Sunday, May 19, 13
![Page 4: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/4.jpg)
In the beginning
4
if (heard?)
if (heard? && used?)
if (heard? && used? && frustrated?)
if (heard? && used? && used_in_project?)
Sunday, May 19, 13
![Page 5: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/5.jpg)
Web Worker
A web worker, as defined by the World Wide Web Consortium (W3C) and the Web Hypertext Application Technology Working Group (WHATWG), is a JavaScript script executed from an HTML page that runs in the background, independently of other, user-interface scripts that may also have been executed from the same HTML page. Web workers are able to utilize multi-core CPUs more effectively.
http://en.wikipedia.org/wiki/Web_worker
5
Sunday, May 19, 13
![Page 6: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/6.jpg)
Web Worker
6
http://en.wikipedia.org/wiki/Web_worker
A web worker, as defined by the World Wide Web Consortium (W3C) and the Web Hypertext Application Technology Working Group (WHATWG), is a JavaScript script executed from an HTML page that runs in the background, independently of other, user-interface scripts that may also have been executed from the same HTML page. Web workers are able to utilize multi-core CPUs more effectively.
Sunday, May 19, 13
![Page 7: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/7.jpg)
7
Sunday, May 19, 13
![Page 8: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/8.jpg)
UI Blocking?
• javascript is single-threaded
• UI rendering
• executing javascript
8http://www.nczonline.net/blog/2010/08/10/what-is-a-non-blocking-script/
Sunday, May 19, 13
![Page 9: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/9.jpg)
Boss said...
9
1+2+3+...+n
Sunday, May 19, 13
![Page 10: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/10.jpg)
That’s easy!function getsum(max) { var cnt = 0; var sum = 0; while (cnt <= max) { sum += cnt++; } return sum;}
10
Sunday, May 19, 13
![Page 11: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/11.jpg)
11
getsum(1,000)
getsum(100,000)
getsum(1,000,000,000)
杯具
Sunday, May 19, 13
![Page 12: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/12.jpg)
DEMO
12
http://blackbing.github.com/WorkerD/why.html
Sunday, May 19, 13
![Page 13: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/13.jpg)
13
Sunday, May 19, 13
![Page 14: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/14.jpg)
14
Sunday, May 19, 13
![Page 15: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/15.jpg)
1+2+..+n =
15
Sunday, May 19, 13
![Page 16: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/16.jpg)
16
Sunday, May 19, 13
![Page 17: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/17.jpg)
Don’t jump into Web Worker for using Web Worker.
17
If you just think it’s cool
,you’ll be frustrated.
Sunday, May 19, 13
![Page 18: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/18.jpg)
18
Sunday, May 19, 13
![Page 19: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/19.jpg)
Expectation
19
It should be faster.It should be easy to use.It should avoid blocking UI.
Sunday, May 19, 13
![Page 20: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/20.jpg)
CAN I USE it on Desktop?
20http://caniuse.com/#search=worker
100%
Sunday, May 19, 13
![Page 21: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/21.jpg)
CAN I USE it on Mobile?
21http://caniuse.com/#search=worker
Sunday, May 19, 13
![Page 22: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/22.jpg)
CAN I USE it on Mobile?
22http://caniuse.com/#search=worker
100%(!?)
Sunday, May 19, 13
![Page 23: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/23.jpg)
23
Sunday, May 19, 13
![Page 24: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/24.jpg)
new Workervar worker = new Worker('worker.js');
worker.postMessage(something); worker.onmessage = function(e) { console.log('Worker said: ', e.data); });
24
self.onmessage = function(e) { self.postMessage(e.data);};
Master
Worker
Sunday, May 19, 13
![Page 25: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/25.jpg)
var worker = new Worker('worker.js'); worker.postMessage(something); worker.addEventListener('message', function(e) { console.log('Worker said: ', e.data);}, false);
25
self.addEventListener('message', function(e) { self.postMessage(e.data);}, false);
Master
Worker
new Worker
Sunday, May 19, 13
![Page 26: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/26.jpg)
Worker cannot access
• window
• DOM
• document
• parent
is undefined
is undefined
is undefined
is undefined
26
Sunday, May 19, 13
![Page 27: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/27.jpg)
Pass window object?
worker.postMessage(window);
27
Master
Sunday, May 19, 13
![Page 28: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/28.jpg)
postMessage
28
worker.postMessage({ 'number': 1234, 'reg': /[\d]+/ig, 'boolean': true, 'object': { 'foo':'bar' }, 'array': ['foo','bar']})
Master
Sunday, May 19, 13
![Page 29: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/29.jpg)
postMessage
29
worker.postMessage({ 'number': 1234, 'reg': /[\d]+/ig, 'boolean': true, 'object': { 'foo':'bar' }, 'array': ['foo','bar'], 'func': function(){ //this is a function }})
Master
Sunday, May 19, 13
![Page 30: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/30.jpg)
30http://ajaxian.com/archives/an-implausibly-illustrated-introduction-to-html5-web-workers
Sunday, May 19, 13
![Page 31: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/31.jpg)
Worker can use• navigator
• location(read-only)
• XMLHttpRequest
• setTimeout/setInterval
• Basic Javascript data Structure and Function(Math, Date, Array, etc.)
31
Functions available to workers : https://developer.mozilla.org/en-US/docs/DOM/Worker/Functions_available_to_workers
Sunday, May 19, 13
![Page 32: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/32.jpg)
32
Web Workers in IE10: Background JavaScript Makes Web Apps Faster
Sunday, May 19, 13
![Page 33: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/33.jpg)
Debug
33
worker.addEventListener('error', function(error){ console.error(error.message); console.error(error.filename); console.error(error.lineno);});
Master
Sunday, May 19, 13
![Page 34: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/34.jpg)
Import Scripts
34
importScripts("http://underscorejs.org/underscore.js")
no jQuery, Backbone, etc.
Worker
Sunday, May 19, 13
![Page 35: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/35.jpg)
Release Worker
35
worker.terminate()
self.close()
Master
Worker
Sunday, May 19, 13
![Page 36: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/36.jpg)
Cost
36
Sunday, May 19, 13
![Page 37: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/37.jpg)
Use Case
Prefetching and/or caching data for later use• Code syntax highlighting or other real-time text formatting• Spell checker• Analyzing video or audio data• Background I/O or polling of web services• Processing large arrays or humungous JSON responses• Image filtering in <canvas>• Updating many rows of a local web database
37
Sunday, May 19, 13
![Page 38: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/38.jpg)
front-end is more and more
• upload image: resize/rotate/filtering
• upload/download file format: use a format for the server, translating other format in client side.
38
powerful
Sunday, May 19, 13
![Page 39: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/39.jpg)
Client-Server
39
Client
Server Server Server Server
Sunday, May 19, 13
![Page 40: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/40.jpg)
Client-Server
40
Master HTML
Worker Worker Worker Worker
Sunday, May 19, 13
![Page 41: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/41.jpg)
Background tasks run while user interacting
• auto save the draft of article
• syntax highlighting
• log user’s behavior(mouse tracking, clicking, etc...)
• prefetching data
• predicting user behavior
• Generate complicated html template41
Sunday, May 19, 13
![Page 42: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/42.jpg)
Mobile
• Limited capability on mobile
• Multicore CPU
42
Sunday, May 19, 13
![Page 43: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/43.jpg)
Real world usage• Syntax highlighting : ace code editor(Bespin)
• Crypto : SHA1 Checksum Calculator
• Graphics/image
• snowCam
• arborjs: http://arborjs.org/
• A User-Driven Web OS: http://grimwire.github.io/grimwire
• parallel.js: http://adambom.github.io/parallel.js/
• Post huge data to server
43
Sunday, May 19, 13
![Page 44: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/44.jpg)
Wanna Try?
• http://webworkersandbox.com/
44
Sunday, May 19, 13
![Page 45: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/45.jpg)
Brief Summary
• What is web worker?
• Basic usage
• onMessage/postMessage
• Debug
• Use case and real world usage
45
Sunday, May 19, 13
![Page 46: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/46.jpg)
Known Issue
• create worker in worker, but it is currently not support in Chrome
• Crash when trying to use many Webworkers
46
Sunday, May 19, 13
![Page 47: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/47.jpg)
Problems
• Break dependency
• Hardly debug
• Troublesome on postMessage
47
Sunday, May 19, 13
![Page 48: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/48.jpg)
Break dependency
48
worker = new Worker('/worker_path/my_worker.js');
define (require)-> require 'jquery' car = require 'lib/car' plane = require 'lib/plane'
break requirejs dependency
Master
Sunday, May 19, 13
![Page 49: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/49.jpg)
inline Worker
49
var jscontent = require('text!workerScript/inline_worker.js');var blobWorker = new Blob([jscontent], {type:'application/javascript'});var blobWorker_url = URL.createObjectURL(blobWorker);
URL.revokeObjectURL(blobWorker_url);inlineWorker.terminate();
var inlineWorker = new Worker(blobWorker_url);
require text pluginMaster
Release resource
Sunday, May 19, 13
![Page 50: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/50.jpg)
Hardly debug
50
worker.addEventListener('error', function(error){ console.error(error.message); console.error(error.filename); console.error(error.lineno);});
no console !?
Master
Sunday, May 19, 13
![Page 51: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/51.jpg)
Troublesome on postMessage
51
var worker = new Worker('worker.js');worker.postMessage({'type': 'task1', data:'blabla'});worker.postMessage({'type': 'task2', data:'blabla'});worker.postMessage({'type': 'task3', data:'blabla'});....
self.addEventListener('message', function(e) { var data = e.data; var type = data.type; if(type === 'task1') //blablabla else if(type === 'task2') //blablabla //......etc}, false);
Master
Worker
Sunday, May 19, 13
![Page 52: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/52.jpg)
Passing Massive Data
52
worker.postMessage({ //it is a very very complicated JSON})
Worker
UI still block!
Master
Sunday, May 19, 13
![Page 53: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/53.jpg)
Solution
• Split the data
• Transferable Object
53
Sunday, May 19, 13
![Page 54: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/54.jpg)
Split data
54
Worker
Sunday, May 19, 13
![Page 55: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/55.jpg)
Transferable Object
55
worker.postMessage({ 'number': 1234, 'reg': /[\d]+/ig, 'boolean': true, 'object': { 'foo':'bar' }, 'array': ['foo','bar'], 'ref_object': object_from_closure,})
worker.postMessage('this is a string');
Worker
structured cloning
Freeeeze!!
Master
Sunday, May 19, 13
![Page 56: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/56.jpg)
pass Transferable Object
56
worker.postMessage(arrayBuffer, [arrayBuffer]);
var SIZE = 1024 * 1024 * 32; // 32MBvar arrayBuffer = new ArrayBuffer(SIZE);var uInt8View = new Uint8Array(arrayBuffer);var originalLength = uInt8View.length;for (var i = 0; i < originalLength; ++i) { uInt8View[i] = i;}worker.postMessage(uInt8View.buffer, [uInt8View.buffer]);
Master
Sunday, May 19, 13
![Page 57: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/57.jpg)
Feature Detection
57
var ab = new ArrayBuffer(1);worker.postMessage(ab, [ab]);//If the buffer is transferred and not copied, its .byteLength will go to 0:if (ab.byteLength) { alert('Transferables are not supported in your browser!');} else { // Transferables are supported.}
http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast
Master
Sunday, May 19, 13
![Page 58: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/58.jpg)
Expectation?
58
It must be faster.
It should be easy to use.
It should avoid blocking UI.
Cost of creating Worker
Hardly to set up dependency
if we need to pass massive data
Sunday, May 19, 13
![Page 59: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/59.jpg)
WorkerD
59
https://github.com/blackbing/WorkerD
bower install WorkerD
Sunday, May 19, 13
![Page 60: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/60.jpg)
Why D?
60
Sunday, May 19, 13
![Page 61: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/61.jpg)
Benefits
61
worker.send('count', {s:1, e:10})
syntax sugar
self.on('count', function(data){ //data is {s:1, e:10}})
Master
Worker
Sunday, May 19, 13
![Page 62: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/62.jpg)
62
console
console.log/error/time/etc...
require([ "./car" "./wheel"], (Car, Wheel) -> car = new Car('red') wheel = new Wheel('iron'))
require
Worker
Worker
Benefits
Sunday, May 19, 13
![Page 63: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/63.jpg)
Example
63
jscontent = require('text!inline_worker.js')
$('#sum_with_worker').on('click', -> loading() worker = new WorkerD(inlineWorker_js) worker.send('getSum', sumMax)
worker.on('gotSum', (event, data)-> log "gotSum: #{data}" loaded() ))
@on "getSum", (max) -> sum = cnt = 0 while(cnt<=max) sum += cnt++
self.send('gotSum', sum)
Master
Worker
Sunday, May 19, 13
![Page 64: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/64.jpg)
console
64
@on "getSum", (max) -> console.group 'getSum' console.time 'getSum' console.log 'getSum' console.log max sum = cnt = 0 while(cnt<=max) sum += cnt++
console.log sum self.send 'gotSum', sum console.log 'inlineWorker send message' console.timeEnd 'getSum' console.groupEnd 'getSum'
Worker
Sunday, May 19, 13
![Page 65: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/65.jpg)
Live Demo
65
http://blackbing.github.com/WorkerD/sandbox.html
Sunday, May 19, 13
![Page 66: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/66.jpg)
Real World Example
66
Sunday, May 19, 13
![Page 68: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/68.jpg)
68
http://antimatter15.github.io/js-typed-array-sha1/
Sunday, May 19, 13
![Page 71: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/71.jpg)
71
http://adambom.github.io/parallel.js/
Sunday, May 19, 13
![Page 72: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/72.jpg)
72
前端效能提升方案
Web Worker 神器
Web Worker老木!?
做!就對了!
Sunday, May 19, 13
![Page 73: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/73.jpg)
More Reading
73
http://www.html5rocks.com/en/tutorials/workers/basics/
http://social.msdn.microsoft.com/Search/en-US?query=web%20worker&ac=5
Sunday, May 19, 13
![Page 74: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/74.jpg)
Thank you
74
Sunday, May 19, 13
![Page 75: 2013 jsdc webworker](https://reader035.vdocuments.site/reader035/viewer/2022081403/554ea15eb4c905977e8b4658/html5/thumbnails/75.jpg)
We are hiring front-end Engineer
75 https://www.facebook.com/blackbingSunday, May 19, 13