<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos processamento em segundo plano - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/processamento-em-segundo-plano/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/processamento-em-segundo-plano/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Wed, 21 Oct 2026 04:31:15 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Arquivos processamento em segundo plano - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/processamento-em-segundo-plano/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML5 Web Workers: Multithreading Prático &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-html/web-workers-multithreading-html5/</link>
					<comments>https://webzoneware.com/web-academy/curso-html/web-workers-multithreading-html5/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 04:30:23 +0000</pubDate>
				<category><![CDATA[Curso de HTML & HTML5]]></category>
		<category><![CDATA[html5 web workers]]></category>
		<category><![CDATA[multithreading html5]]></category>
		<category><![CDATA[postmessage worker]]></category>
		<category><![CDATA[processamento em segundo plano]]></category>
		<category><![CDATA[web workers javascript]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29350</guid>

					<description><![CDATA[<p>Tradicionalmente, os navegadores web executam o código JavaScript em uma thread única (a chamada Main Thread ou Thread de UI). Nessa arquitetura, o mesmo motor encarregado de processar seus scripts também é responsável por redesenhar a tela, renderizar estilos CSS e responder a cliques e eventos de rolagem do usuário. Se você disparar uma operação [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/web-workers-multithreading-html5/">HTML5 Web Workers: Multithreading Prático | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Tradicionalmente, os navegadores web executam o código JavaScript em uma <strong>thread única</strong> (a chamada <em>Main Thread</em> ou Thread de UI). Nessa arquitetura, o mesmo motor encarregado de processar seus scripts também é responsável por redesenhar a tela, renderizar estilos CSS e responder a cliques e eventos de rolagem do usuário. Se você disparar uma operação pesada nessa thread, a página inteira simplesmente congela. A introdução dos <strong>HTML5 Web Workers</strong> quebrou essa barreira, trazendo o verdadeiro <strong>multithreading</strong> para a web e permitindo rodar cálculos intensivos em segundo plano com fluidez total.
</p>
<h2>1. O Problema do Congelamento da Interface (Jank)</h2>
<p>
    Imagine que sua aplicação precise ordenar uma matriz com 500 mil registros, calcular filtros matemáticos sobre uma foto em alta definição ou processar um arquivo volumoso.
</p>
<p>
    Se esse processamento for executado na thread principal:
</p>
<ul>
<li>As animações CSS e transições de tela caem de 60 FPS para zero.</li>
<li>O cursor do mouse para de responder e os botões parecem quebrados.</li>
<li>Após alguns segundos, o navegador exibe a temida janela de alerta: <em>&#8220;Esta página não está respondendo. Deseja aguardar ou fechar?&#8221;</em>.</li>
</ul>
<div class="wzw-pro-tip">
<h4>💡 A Solução com Web Workers</h4>
<p>
        Um <strong>Web Worker</strong> é uma linha de execução de segundo plano independente gerenciada pelo próprio sistema operacional. Ele opera em paralelo à interface visual: enquanto o Worker consome 100% de um núcleo de CPU triturando dados complexos, a página principal continua rolando suavemente a 60 quadros por segundo sem qualquer engasgo.
    </p>
</div>
<h2>2. O Que um Web Worker Pode e NÃO Pode Acessar</h2>
<p>
    Para evitar problemas clássicos de concorrência e corrupção de memória (como <em>race conditions</em> ou deadlocks), os Web Workers operam sob um modelo de isolamento estrito:
</p>
<div class="wzw-table-responsive">
<table class="wzw-tech-table">
<thead>
<tr>
<th>Recurso</th>
<th>Acesso Permitido no Worker?</th>
<th>Motivo Técnico</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Árvore do DOM</strong> (<code>window</code>, <code>document</code>)</td>
<td>❌ Proibido</td>
<td>O DOM não é seguro para operações concorrentes simultâneas de múltiplas threads.</td>
</tr>
<tr>
<td><strong>Rede e Comunicação</strong> (<code>fetch</code>, <code>XMLHttpRequest</code>, <code>WebSocket</code>)</td>
<td>✅ Permitido</td>
<td>Permite baixar e processar grandes pacotes de dados diretamente em background.</td>
</tr>
<tr>
<td><strong>Temporizadores</strong> (<code>setTimeout</code>, <code>setInterval</code>)</td>
<td>✅ Permitido</td>
<td>Controle temporal padrão do ambiente JavaScript.</td>
</tr>
<tr>
<td><strong>Bancos de Dados Locais</strong> (<code>IndexedDB</code>)</td>
<td>✅ Permitido</td>
<td>Permite ler e gravar gigabytes de dados no cliente sem bloquear a tela.</td>
</tr>
<tr>
<td><strong>Importação de Módulos</strong> (<code>importScripts()</code>)</td>
<td>✅ Permitido</td>
<td>Permite importar bibliotecas externas para o contexto do worker.</td>
</tr>
</tbody>
</table>
</div>
<h2>3. O Mecanismo de Troca de Mensagens (postMessage)</h2>
<p>
    Como a página principal e o Worker habitam universos isolados, toda a comunicação é feita através de <strong>passagem de mensagens serializadas</strong>:
</p>
    <div class="wzw-ide-card" id="wzw-code-59254" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">20 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-59254', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-59254', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// === NA PÁGINA PRINCIPAL (main.js) ===</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 1. Cria a thread dedicada apontando para o arquivo do worker</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> meuWorker = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">Worker</span>(<span class="wzw-tk-str">&#039;calculadora-worker.js&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 2. Envia uma carga de dados para o worker processar</span></span>
<span class="wzw-code-line">meuWorker.<span class="wzw-tk-fn">postMessage</span>({ numeroInicial: <span class="wzw-tk-num">5000000</span> });</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 3. Ouve a resposta enviada de volta pelo worker</span></span>
<span class="wzw-code-line">meuWorker.onmessage = <span class="wzw-tk-kw">function</span>(evento) {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">&#039;Resultado recebido do Worker:&#039;</span>, evento.data.resultado);</span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 4. Captura eventuais erros de execução</span></span>
<span class="wzw-code-line">meuWorker.onerror = <span class="wzw-tk-kw">function</span>(erro) {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">error</span>(<span class="wzw-tk-str">&#039;Erro no Worker:&#039;</span>, erro.message);</span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 5. Encerra a thread quando não for mais necessária</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// meuWorker.terminate();</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// === NA PÁGINA PRINCIPAL (main.js) ===

// 1. Cria a thread dedicada apontando para o arquivo do worker
const meuWorker = new Worker(&#039;calculadora-worker.js&#039;);

// 2. Envia uma carga de dados para o worker processar
meuWorker.postMessage({ numeroInicial: 5000000 });

// 3. Ouve a resposta enviada de volta pelo worker
meuWorker.onmessage = function(evento) {
    console.log(&#039;Resultado recebido do Worker:&#039;, evento.data.resultado);
};

// 4. Captura eventuais erros de execução
meuWorker.onerror = function(erro) {
    console.error(&#039;Erro no Worker:&#039;, erro.message);
};

// 5. Encerra a thread quando não for mais necessária
// meuWorker.terminate();</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-59919" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">22 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-59919', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-59919', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// === DENTRO DO WORKER (calculadora-worker.js) ===</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// O escopo global do worker é acessado via &#039;self&#039;</span></span>
<span class="wzw-code-line">self.onmessage = <span class="wzw-tk-kw">function</span>(evento) {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> limite = evento.data.numeroInicial;</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">let</span> totalPrimos = <span class="wzw-tk-num">0</span>;</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">// Cálculo matemático intensivo que demoraria segundos</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">for</span> (<span class="wzw-tk-kw">let</span> i = <span class="wzw-tk-num">2</span>; i &lt;= limite; i++) {</span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">let</span> primo = <span class="wzw-tk-kw">true</span>;</span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">for</span> (<span class="wzw-tk-kw">let</span> j = <span class="wzw-tk-num">2</span>; j * j &lt;= i; j++) {</span>
<span class="wzw-code-line">            <span class="wzw-tk-kw">if</span> (i % j === <span class="wzw-tk-num">0</span>) {</span>
<span class="wzw-code-line">                primo = <span class="wzw-tk-kw">false</span>;</span>
<span class="wzw-code-line">                <span class="wzw-tk-kw">break</span>;</span>
<span class="wzw-code-line">            }</span>
<span class="wzw-code-line">        }</span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">if</span> (primo) totalPrimos++;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">// Devolve o resultado para a thread principal</span></span>
<span class="wzw-code-line">    self.<span class="wzw-tk-fn">postMessage</span>({ resultado: totalPrimos });</span>
<span class="wzw-code-line">};</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// === DENTRO DO WORKER (calculadora-worker.js) ===

// O escopo global do worker é acessado via &#039;self&#039;
self.onmessage = function(evento) {
    const limite = evento.data.numeroInicial;
    let totalPrimos = 0;

    // Cálculo matemático intensivo que demoraria segundos
    for (let i = 2; i &lt;= limite; i++) {
        let primo = true;
        for (let j = 2; j * j &lt;= i; j++) {
            if (i % j === 0) {
                primo = false;
                break;
            }
        }
        if (primo) totalPrimos++;
    }

    // Devolve o resultado para a thread principal
    self.postMessage({ resultado: totalPrimos });
};</textarea>
        </div>
    </div>
    
<h2>4. Código Prático Completo: Demonstração Interativa Sem Travamento</h2>
<p>
    Para facilitar testes imediatos sem a necessidade de criar múltiplos arquivos no servidor, podemos gerar o Worker dinamicamente em memória através de um <strong>Blob URL</strong>:
</p>
    <div class="wzw-ide-card" id="wzw-code-18693" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">10 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-18693', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-18693', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;wzw-worker-demo&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3&gt;</span>⚡ Demonstração de Concorrência Real com Web Worker<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    </span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Elemento com animação CSS contínua para provar a fluidez visual --&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;spinner-teste&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p&gt;</span><span class="wzw-tk-tag">&lt;small&gt;</span>Observe como este ícone gira sem qualquer interrupção durante o cálculo pesado.<span class="wzw-tk-tag">&lt;/small&gt;</span><span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;btnCalcular&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-worker&quot;</span><span class="wzw-tk-tag">&gt;</span>Calcular Números Primos em Background<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;painelStatus&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-box&quot;</span><span class="wzw-tk-tag">&gt;</span>Aguardando comando...<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;wzw-worker-demo&quot;&gt;
    &lt;h3&gt;⚡ Demonstração de Concorrência Real com Web Worker&lt;/h3&gt;
    
    &lt;!-- Elemento com animação CSS contínua para provar a fluidez visual --&gt;
    &lt;div class=&quot;spinner-teste&quot;&gt;&lt;/div&gt;
    &lt;p&gt;&lt;small&gt;Observe como este ícone gira sem qualquer interrupção durante o cálculo pesado.&lt;/small&gt;&lt;/p&gt;

    &lt;button id=&quot;btnCalcular&quot; class=&quot;btn-worker&quot;&gt;Calcular Números Primos em Background&lt;/button&gt;
    &lt;div id=&quot;painelStatus&quot; class=&quot;status-box&quot;&gt;Aguardando comando...&lt;/div&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-15800" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">41 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-15800', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-15800', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Animação que provará a ausência de congelamento da UI */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> girarSuave {</span>
<span class="wzw-code-line">    from { transform: rotate(<span class="wzw-tk-num">0deg</span>); }</span>
<span class="wzw-code-line">    to { transform: rotate(<span class="wzw-tk-num">360deg</span>); }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.spinner-teste {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">width</span>: <span class="wzw-tk-num">44px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">44px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">margin</span>: <span class="wzw-tk-num">12px</span> 0;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">5px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-top-color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: 50%;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">animation</span>: girarSuave <span class="wzw-tk-num">1s</span> linear infinite;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.wzw-worker-demo {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">24px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-worker {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">12px</span> <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#10b981</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#fff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: none;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-weight</span>: 600;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.status-box {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">margin-top</span>: <span class="wzw-tk-num">15px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-family</span>: monospace;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Animação que provará a ausência de congelamento da UI */
@keyframes girarSuave {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}

.spinner-teste {
    width: 44px;
    height: 44px;
    margin: 12px 0;
    border: 5px solid #334155;
    border-top-color: #38bdf8;
    border-radius: 50%;
    animation: girarSuave 1s linear infinite;
}

.wzw-worker-demo {
    padding: 24px;
    background-color: #0f172a;
    border: 1px solid #1e293b;
    border-radius: 8px;
    color: #f8fafc;
}

.btn-worker {
    padding: 12px 20px;
    background-color: #10b981;
    color: #fff;
    border: none;
    border-radius: 6px;
    cursor: pointer;
    font-weight: 600;
}

.status-box {
    margin-top: 15px;
    padding: 12px;
    background-color: #1e293b;
    border-radius: 6px;
    font-family: monospace;
}</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-16049" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">33 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-16049', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-16049', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// Código do Worker encapsulado em string para teste imediato</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> codigoWorker = `</span>
<span class="wzw-code-line">    self.onmessage = <span class="wzw-tk-kw">function</span>(e) {</span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">const</span> n = e.data;</span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">let</span> contagem = <span class="wzw-tk-num">0</span>;</span>
<span class="wzw-code-line">        <span class="wzw-tk-comment">// Laço pesado proposital</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-kw">for</span> (<span class="wzw-tk-kw">let</span> i = <span class="wzw-tk-num">0</span>; i &lt; n; i++) {</span>
<span class="wzw-code-line">            contagem += Math.<span class="wzw-tk-fn">sqrt</span>(i);</span>
<span class="wzw-code-line">        }</span>
<span class="wzw-code-line">        self.<span class="wzw-tk-fn">postMessage</span>(<span class="wzw-tk-str">&#039;Cálculo concluído com sucesso: &#039;</span> + Math.<span class="wzw-tk-fn">round</span>(contagem));</span>
<span class="wzw-code-line">    };</span>
<span class="wzw-code-line">`;</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Criação do Worker inline via Blob</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> blob = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">Blob</span>([codigoWorker], { type: <span class="wzw-tk-str">&#039;application/javascript&#039;</span> });</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> workerUrl = URL.<span class="wzw-tk-fn">createObjectURL</span>(blob);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> workerInline = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">Worker</span>(workerUrl);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> btn = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;btnCalcular&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> status = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;painelStatus&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">btn.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;click&#039;</span>, () =&gt; {</span>
<span class="wzw-code-line">    status.textContent = <span class="wzw-tk-str">&#039;⏳ Executando cálculo massivo em thread separada... A animação continua a 60 FPS!&#039;</span>;</span>
<span class="wzw-code-line">    btn.disabled = <span class="wzw-tk-kw">true</span>;</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">// Dispara a carga de trabalho para a thread paralela</span></span>
<span class="wzw-code-line">    workerInline.<span class="wzw-tk-fn">postMessage</span>(<span class="wzw-tk-num">20000000</span>);</span>
<span class="wzw-code-line">});</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">workerInline.onmessage = <span class="wzw-tk-kw">function</span>(evento) {</span>
<span class="wzw-code-line">    status.textContent = <span class="wzw-tk-str">&#039;✅ &#039;</span> + evento.data;</span>
<span class="wzw-code-line">    btn.disabled = <span class="wzw-tk-kw">false</span>;</span>
<span class="wzw-code-line">};</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// Código do Worker encapsulado em string para teste imediato
const codigoWorker = `
    self.onmessage = function(e) {
        const n = e.data;
        let contagem = 0;
        // Laço pesado proposital
        for (let i = 0; i &lt; n; i++) {
            contagem += Math.sqrt(i);
        }
        self.postMessage(&#039;Cálculo concluído com sucesso: &#039; + Math.round(contagem));
    };
`;

// Criação do Worker inline via Blob
const blob = new Blob([codigoWorker], { type: &#039;application/javascript&#039; });
const workerUrl = URL.createObjectURL(blob);
const workerInline = new Worker(workerUrl);

const btn = document.getElementById(&#039;btnCalcular&#039;);
const status = document.getElementById(&#039;painelStatus&#039;);

btn.addEventListener(&#039;click&#039;, () =&gt; {
    status.textContent = &#039;⏳ Executando cálculo massivo em thread separada... A animação continua a 60 FPS!&#039;;
    btn.disabled = true;

    // Dispara a carga de trabalho para a thread paralela
    workerInline.postMessage(20000000);
});

workerInline.onmessage = function(evento) {
    status.textContent = &#039;✅ &#039; + evento.data;
    btn.disabled = false;
};</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer testar o Web Worker e multithreading no seu navegador agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>5. Transferência de Dados com Zero Latência (Transferable Objects)</h2>
<p>
    Por padrão, o método <code>postMessage()</code> realiza uma cópia estruturada (<em>structured clone</em>) dos objetos. Para matrizes gigantes ou buffers de imagem com dezenas de megabytes gerados via Canvas, duplicar a memória pode causar lentidão momentânea.
</p>
<p>
    Para resolver isso, o HTML5 suporta <strong>Transferable Objects</strong> (como instâncias de <code>ArrayBuffer</code>), onde a posse da memória é transferida instantaneamente para o Worker sem cópia física:
</p>
    <div class="wzw-ide-card" id="wzw-code-71951" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">7 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-71951', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-71951', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// Cria um buffer de 32 Megabytes</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> bufferGigante = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">ArrayBuffer</span>(<span class="wzw-tk-num">32</span> * <span class="wzw-tk-num">1024</span> * <span class="wzw-tk-num">1024</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// O segundo argumento transfere a posse com latência zero (Zero-Copy)</span></span>
<span class="wzw-code-line">meuWorker.<span class="wzw-tk-fn">postMessage</span>(bufferGigante, [bufferGigante]);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Na thread principal, bufferGigante.byteLength agora vale 0!</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// Cria um buffer de 32 Megabytes
const bufferGigante = new ArrayBuffer(32 * 1024 * 1024);

// O segundo argumento transfere a posse com latência zero (Zero-Copy)
meuWorker.postMessage(bufferGigante, [bufferGigante]);

// Na thread principal, bufferGigante.byteLength agora vale 0!</textarea>
        </div>
    </div>
    
<h2>6. Ferramentas Relacionadas &#038; Próximos Passos</h2>
<p>
    Continue explorando as tecnologias avançadas de processamento e dados da nossa suíte:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/central-dev/">Central do Desenvolvedor Web</a>: Utilitários para medição de desempenho, validação e manipulação de scripts.</li>
<li><a href="https://webzoneware.com/web-ferramentas/hub-imagens/">Hub Master de Imagens</a>: Filtros e conversores gráficos que utilizam processamento em segundo plano.</li>
<li><a href="https://webzoneware.com/web-academy/html/canvas-graficos-2d-html5/">Lição 34: Canvas: Gráficos 2D no Navegador</a>: Combine renderização vetorial e rasterizada com Web Workers via OffscreenCanvas.</li>
<li><a href="https://webzoneware.com/web-academy/html/server-sent-events-sse-html5/">Lição 40: Server-Sent Events (SSE)</a>: Receba transmissões contínuas de dados do servidor em tempo real.</li>
</ul>
<h2>7. Referências Técnicas &#038; Especificações Oficiais</h2>
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/workers.html" target="_blank" rel="noopener">WHATWG HTML Living Standard: Web Workers Specification</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API" target="_blank" rel="noopener">MDN Web Docs: Web Workers API Architecture &#038; Guides</a></li>
<li><a href="https://www.w3.org/TR/workers/" target="_blank" rel="noopener">W3C Web Workers Working Draft</a></li>
</ul>
<p><!-- Schema.org TechArticle JSON-LD --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "HTML5 Web Workers: Multithreading e Tarefas em Background",
  "description": "Aprenda a executar scripts em segundo plano sem travar a interface do usuário com Web Workers e multithreading no HTML5.",
  "url": "https://webzoneware.com/web-academy/html/web-workers-multithreading-html5/",
  "inLanguage": "pt-BR",
  "proficiencyLevel": "Advanced",
  "articleSection": "Web Academy - Curso de HTML & HTML5 Completo",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "url": "https://webzoneware.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "logo": {
      "@type": "ImageObject",
      "url": "https://webzoneware.com/wp-content/themes/astra-child/assets/images/logo.png"
    }
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/web-workers-multithreading-html5/">HTML5 Web Workers: Multithreading Prático | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-html/web-workers-multithreading-html5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
