/** * Trabalho limitado por CPU, e o worker que o executa em outra thread. * * `calcularAssinatura` não espera por nada: é um laço de multiplicações (uma * variação do hash FNV-1a) que só termina quando o processador termina. Serve * de modelo para tarefas como gerar miniaturas de capas, montar um índice de * busca ou produzir um relatório em PDF. * * O mesmo arquivo roda dos dois lados. Quando é importado pela thread * principal, `isMainThread` é verdadeiro e nada acontece além das definições; * quando é carregado como worker, ele lê o pedido de `workerData`, calcula e * devolve o resultado por mensagem. O worker não enxerga as variáveis de quem * o criou: recebe uma cópia dos dados e devolve outra cópia — é esse * isolamento que dispensa travas neste exemplo. * * O número de rodadas foi escolhido para levar cerca de 300 ms em um * computador de 2026. Na sua máquina o tempo pode ser outro; o que importa é * a comparação entre as versões, não o valor absoluto. */ import { isMainThread, parentPort, workerData } from 'node:worker_threads'; export const RODADAS = 240_000_000; export function calcularAssinatura(livroId: number, rodadas: number): number { let hash = (0x811c9dc5 ^ livroId) >>> 0; for (let rodada = 0; rodada < rodadas; rodada += 1) { hash ^= rodada & 0xff; hash = Math.imul(hash, 0x01000193); } return hash >>> 0; } function ehPedido(valor: unknown): valor is { livroId: number; rodadas: number } { if (typeof valor !== 'object' || valor === null) return false; const candidato = valor as Record; return typeof candidato.livroId === 'number' && typeof candidato.rodadas === 'number'; } if (!isMainThread) { if (!ehPedido(workerData)) { throw new TypeError('workerData fora do formato esperado'); } parentPort?.postMessage(calcularAssinatura(workerData.livroId, workerData.rodadas)); }