Deno + Multithreading: Workers와 함께하는 Somando números
11518 단어 braziliandevsdenotypescripttutorial
면책 조항/끄기: e estou apaixonada, diga-se de passagem. 공룡의 운명을 결정짓는 방법은 공룡의 속도와 속도를 높이는 것과 노드를 비교하는 것입니다. 🤪
Enquanto Avaliava o opções para executar um desafio proposto pelo, acabei me deparando com a Worker API . Pensei em utilizá-lo para o desafio, mas senti que essa não era a melhor opção para solucionar o problema.
No mesmo dia que terminei o hexchange , um novo desafio já havia sido lançado: . Esse um cenário "perfeito"para testar os workers - apesar de não ser necessariamente um processamento distribuído, e sim multithread.
Tendo isso em mente, eu tentei bolar uma implementação "simples". 바모스 라! Mas antes de começar...
Workers no Deno?
노동자들은 다른 종류의 스레드를 실행할 수 있도록 허용합니다. Cada instância de um worker é executada em uma thread dedicada unicamente para o mesmo.
Para sua execução, é necessário ter um parent e um arquivo que irá executar a lógica de processamento, denominado como worker.
오 부모
O 부모 ficará responsável por criar a logica para a instanciação dos workers e, também, do recebimento dos resultados do seu processamento.
Para podermos solicitar a execução de um worker, mandamos uma mensagem através do método
postMessage
, que deve conter todos os dados a serem processados.No caso do desafio proposto, eu precisava solicitar a soma de uma linha com 200 números, então a implementação ficou mais ou menos assim:
const createWorkerURL = (filename: string): string => new URL(filename, import.meta.url).href;
export function sumDistributedFileNumbers(line: string, name: string): Promise<number> {
return new Promise((resolve) => {
const worker = new Worker(createWorkerURL('./workers.ts'), { type: 'module' });
worker.addEventListener('message', (message) => {
console.log(`Total of ${message.data.sum} returned from ${message.data.name}`);
resolve(message.data.sum);
});
worker.postMessage({ line, name });
});
}
Nesse caso, além da implementação comum, usei mais duas coisas:
Promises
e o método addEventListener
do próprio Worker.No caso da promise, 정확한 utilizá-la para garantir que quando minha função retornasse alguma coisa, ela já retornasse a soma de todos os números daquela linha. Já o método
addEventListener
, utiliti para poder receber a soma total da linha - que seria enviado através do worker para o parent.노동자에 대한 비판에 주목하십시오.
오스 워커스
Ainda seguindo no raciocínio do desafio proposto, dentro dos workers eu teria que ler uma linha inteira contendo 200 números no total. Para chegar nesse resultado, essa foi a logica do arquivo dos worker:
type MessageContent = {
line: string;
name: string;
};
self.onmessage = ({ data: { line, name } }: MessageEvent<MessageContent>): void => {
const sum = line
.split(' ')
.map((num) => Number(num))
.reduce((a, b) => {
return a + b;
});
self.postMessage({ sum, name });
self.close();
};
Dessa forma, a soma é realizada e, por fim, o resultado da soma é enviado de volta para o parent.
Resultado 결승
Para consolidar o resultado final, ou seja, todas as somas parciais geradas pelos workers, o arquivo
main.js
recebe uma série de promise e as executa através do método Promise.all
. Em uma execução de sucesso, receberemos algo parecido:Total of 52499 returned from worker-1298
Total of 53023 returned from worker-1427
Total of 46830 returned from worker-1428
Total of 48380 returned from worker-1557
Total of 44707 returned from worker-1558
Total of 53450 returned from worker-1687
Total of 53031 returned from worker-1688
Total of 50385 returned from worker-1817
Total of 52455 returned from worker-1818
Total of 50101 returned from worker-1947
Total of 51728 returned from worker-1948
File total sum: 102367758!
Processing finished with 17589.7198 ms.
Com a complexidade O(n²), aplicação leva em media ~18 segundos para executar a soma de 20.000 linhas de um arquivo, thinkando que existam 200 números por linha.
O próximo passo será executar ~de fato~ o exercício seguindo a premissa de processamento distribuído e, por fim, compará-lo com este.
면책 조항
Gostaria de agradecer ao por me incentivar a dar o primeiro passo com a criação de conteúdo através dos seus desafios! 무이토 오브리가다! 😁
Até a proxima! 🤗
Reference
이 문제에 관하여(Deno + Multithreading: Workers와 함께하는 Somando números), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/devtorello/deno-multithreading-somando-numeros-com-workers-38k2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)