Files
archived-doc-pt-br/reference/parallel/philosophy.xml
Leonardo Lara Rodrigues 17d859faaf sync line numbers with en rev
2026-01-23 09:16:58 -03:00

76 lines
4.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 57c7669a1f5336cb17413e0b46540c52c77ee84f Maintainer: fernandowobeto Status: ready --><!-- CREDITS: fernandowobeto -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="philosophy.parallel">
<title>Filosofia</title>
<simpara>
Esta seção contém filosofias importantes para escrever código paralelo e alguns detalhes sobre a implementação interna do parallel.
</simpara>
<simplesect role="sharing">
<title>Não se comunique compartilhando memória; em vez disso, compartilhe a memória comunicando-se.</title>
<simpara>
Essa filosofia abraçada pelo parallel tem sua origem no Go, uma das plataformas mais admiradas, senão mais utilizadas, para escrever código paralelo no momento.
Os programadores Go precisam trabalhar duro para atingir esse ideal: PHP e parallel fazem todo o trabalho duro para o programador, e por padrão.
</simpara>
<simpara>
Em modelos convencionais de threading encontrados em outras linguagens, geralmente os threads se comunicam entre si apenas pelo fato de
operarem no mesmo espaço de endereço.
O programador deve implantar exclusão mútua, variáveis de condição e outras primitivas de threading ou sincronização de baixo nível para garantir a comunicação adequada
de estado e consistência.
</simpara>
<simpara>
Quando o modelo convencional é invertido, significa que as threads só compartilham memória como resultado da comunicação (uma variável é passada por um Channel, por exemplo).
</simpara>
<simpara>
Quando o parallel passa uma variável de um thread para outro por qualquer meio - argumentos de Task, retorno via Future e Channels - ela é passada por valor.
Em todos os casos, exceto no caso de canais sem buffer, a variável também é armazenada em buffer para que não possa ser alterada (ou destruída) antes de ser usada em qualquer thread para o qual a variável
está sendo passada. Uma leitura sem buffer em um channel é a única instância em que um thread lê diretamente a memória alocada por outro thread. Ele pode fazê-lo com segurança porque
o thread que possui a memória está aguardando que a leitura seja concluída antes que possa continuar a manipulá-la, e o thread que não possui a memória lê por valor. Quando
ambos os threads continuam, eles não estão mais compartilhando memória.
</simpara>
<simpara>
Isso torna a escrita e o raciocínio sobre código paralelo muito mais fáceis do que o modelo convencional de threading. Isso significa que o programador não precisa considerar que threads
podem estar manipulando dados simultaneamente, porque isso não é possível.
</simpara>
<simpara>
Isso também torna o PHP a plataforma perfeita para implementar uma API de simultaneidade paralela baseada em CSP (passagem de mensagens por canais), porque o PHP em si não é compartilhado -
threads PHP operam em seu próprio espaço de endereço virtual por padrão e, portanto, só podem compartilhar memória comunicando-se.
</simpara>
</simplesect>
<simplesect role="owning">
<title>Os dados devem ter um único proprietário definitivo</title>
<simpara>
Ao abordar o modelo CSP pela primeira vez, um programador versado no modelo tradicional de threading pode se encontrar procurando estruturas de dados simultâneas,
porque é por isso que elas também são usadas: elas passam objetos compartilhados para manipulação.
</simpara>
<simpara>
Quando se trata do modelo CSP, não há necessidade de as estruturas de dados serem compartilhadas por muitas tarefas e, na verdade, é mais simples se não forem. Os dados devem pertencer
a uma única tarefa, as alterações (ou operações) nessa estrutura de dados devem ser comunicadas através de canais e executadas pelo proprietário dos dados, o sucesso, a falha
ou o resultado (estado) da alteração (ou operação) sendo comunicado de volta.
</simpara>
<simpara>
Mais uma vez a natureza de zero compartilhamento do PHP e a natureza de cópia por valor do parallel ajudam o programador a atingir esse objetivo, nenhum dado será compartilhado por acidente,
e sim apenas como resultado de comunicação.
</simpara>
</simplesect>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->