[whatwg] WebWorkers vs. Threads
Jonas Sicking
jonas at sicking.cc
Mon Aug 11 10:22:52 PDT 2008
Shannon wrote:
> Jonas Sicking wrote:
>> Shannon wrote:
>>> I've been following the WebWorkers discussion for some time trying to
>>> make sense of the problems it is trying to solve. I am starting to
>>> come to the conclusion that it provides little not already provided by:
>>>
>>> setTimeout(mainThreadFunc,1)
>>> setTimeout(workThreadFunc,2)
>>> setTimeout(workThreadFunc,2)
>>
>> Web workers provide two things over the above:
>>
>> 1. It makes it easier for the developer to implement heavy complex
>> algorithms while not hanging the browser.
>> 2. It allows web pages to take advantage of multicore CPUs.
>>
>> details:
>> What you describe above is also known as cooperative multithreading.
>> I.e. each "thread" has to manually stop itself regularly and give
>> control to the other threads, and eventually they must do the same and
>> give control back.
>>
>> However this means that you have to deep inside your threads algorithm
>> return out to the main event loop. This can be complicated if you have
>> a deep callstack with a lot of local variables holding a lot of state.
>>
>> Thus 1. Threading is easier to implement using workers since you don't
>> have to escape back out to the main event loop.
>>
>> Also, web workers allow the browser to spin up real OS threads and put
>> off the worker execution there. So if you have a multicore CPU, which
>> is becoming very common today, the work the page is doing can take
>> advantage of more cores, thus producing better throughput.
>>
>> I'm also unsure which mozilla developer has come out against the idea
>> of web workers. I do know that we absolutely don't want the
>> "traditional" threading APIs that include locks, mutexes,
>> synchronization, shared memory etc. But that's not what the current
>> spec has. It is a much much simpler "shared nothing" API which already
>> has a basic implementation in recent nightlies.
>>
>> / Jonas
>>
>
> I assumed setTimeout used real threads but I'm not advocating its use
> anyway. I think Lua co-routines solve every issue you raise. I hope
> WebWorkers will follow this model because I know from experience they
> are very easy to use. The basic features are:
>
> * each coroutine gets a real OS thread (if available).
> * coroutines can access global variables; Lua handles the locking itself.
> * yield and resume are available, but optional.
> * coroutines are garbage-collected when complete.
> * coroutines run a function, not a file. There is no need for a separate
> file download.
>
> the syntax is:
>
> function workerThreadFunction()
> ... do stuff ...
> end
>
> workerThread1 = coroutine.create( workerThreadFunction )
>
> A Javascript implementation could also assist the programmer by
> automatically skipping threads that are waiting on IO or blocked waiting
> on user input since these actions usually represent a large faction of a
> web page workload.
>
> Maybe I misunderstand the concept of "shared nothing" but I think
> denying access to global objects is unwise. Maybe in a low-level
> language like C that's a bad thing but high-level languages can
> serialise simultaneous access to variables to prevent crashes and
> deadlocks. Performance can be improved by explicitly declaring private
> thread variables using var.
>
> If coroutines are adopted I hope they will be called "coroutines".
> WebWorkers sounds silly and doesn't really assist in understanding their
> purpose (you have to already know what they are to understand the analogy).
>
> I think this proposal belongs in an ECMAScript discussion group but I
> only bring it up here due to my extreme dislike of the current
> WebWorkers proposal. I think the best way forward is to drop WebWorkers
> completely from HTML5 and let the ECMAScript group look at it for JS 2.0
> or 3.0.
One problem with what you're proposing is that in a browser environment
the C host language and the javascript language is heavily intertwined.
What do you do if a co-routine that lives in a separate thread calls
into the DOM, which in most (all?) browser implementations isn't
threadsafe? And what if that DOM call results in callbacks into
javascript again?
/ Jonas
More information about the whatwg
mailing list