I currently have this code to create a Web Worker:
w = new Worker("webwork.js"); w.onmessage = function(event) { alert(event.data); }
And then the webwork.js
code for the Web Worker:
self.onmessage = function(event) { //var ss=r; //Causes error because of undefined var ss=""; for(var currProp in event) { ss+=("event."+currProp+"="+event[currProp]+"\n"); } postMessage(ss); }
Now I want to transfer a 128-Megabyte ArrayBuffer
with this code:
var r = new ArrayBuffer(1048576*128); w.postMessage(0, [r]);
Now that I have supposedly transferred the variable r
, how do I access it from the Web Worker itself. I have tried event.r
, just r
, self.r
and other things like trying to add a second function argument for the array of ArrayBuffers
, but nothing works.
How can I access the transferred variable(s) from the Web Worker?
This means that the methods for the objects you send to your web worker are not something that can be passed to the web worker (causing the error that you have run into), and you will need to provide the necessary methods/functions to the objects on the web worker's side of the environment, and make sure they are not ...
A web worker is a JavaScript program running on a different thread, in parallel with main thread. The browser creates one thread per tab. The main thread can spawn an unlimited number of web workers, until the user's system resources are fully consumed.
As you will probably know by now, messages can be sent to and from the main thread by using postMessage() , and the message event's data attribute contains data passed back from the worker.
Web Workers are primarily used for CPU-intensive tasks to be run in the background without any network connectivity required to work on the tasks.
The answer given by sbr works, but it would cause a copy of the data to be made before being sent to the worker. That could be slow for a large amount of data.
To use "transferable objects" you actually transfer the ownership of the object to or from the web worker. It's like passing by reference where a copy isn't made. The difference between it and the normal pass-by-reference is that the side that transferred the data can no longer access it.
I believe the way you should send the data in your example is:
w.postMessage(r,[r]); // first arg is r, not 0 as in the question
And the way you would access it in the web worker:
addEventListener('message', function(event) { var r = event.data; });
In my own application I needed to send a large typed Float64Array from the web worker to the main thread, without the performance penalty of the copy. It took lots of trial and error and searching, so I figured I should include that example here for anyone else who gets stuck with a similar problem.
This is the code that worked on the worker side (arr is my Float64Array):
self.postMessage(arr.buffer, [arr.buffer]);
On the receiving main thread I have:
theWorker.addEventListener('message', function(ev) { var arr = new Float64Array(ev.data); // just cast it to the desired type - no copy made // ... });
Note that this works in Chrome, but maybe not most other browsers as of this date (haven't tried yet.)
Also, if you want to send other information in addition to the large array, you can do this:
self.postMessage({foo:"foo", bar:arr.buffer}, [arr.buffer]);
On the receiving (in this example the main) thread:
theWorker.addEventListener('message', function(event) { var foo = event.data.foo; var arr = new Float64Array(event.data.bar); // cast it to the desired type // ... });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With