Primeiras aulas do curso PHP Parallel: Processos, Threads e Channels

PHP Parallel: Processos, Threads e Channels

Conceitos iniciais - Introdução

Sejam muito bem-vindos a Alura. Meu nome é Vinícius Dias e eu vou guiar vocês nesse Treinamento de Programação Paralela Utilizando PHP. Então, nesse treinamento, antes de qualquer coisa iremos entender o que é programação paralela, como que o PHP se comporta de forma paralela na web, mas o nosso foco vai ser fora da web.

Como um exemplo, teremos um sistema onde os alunos vão fazer upload de suas fotos de perfil e, normalmente, eles irão mandar fotos muito grandes.

Então vamos ter um processo que vai rodar toda à noite, pela linha de comando, para redimensionar suas imagens e poupar espaço. Esse é um processo demorado, então iremos conseguir entender a vantagem de programação paralela. Enquanto vamos aprendendo, precisaremos instalar extensão "Parallel" o que permite a programação paralela com PHP.

Com isso iremos aprender a criar uma "Runtime" e rodar tarefas em cada uma das runtimes, aprenderemos como se comunicar entre diferentes "Threads" diferentes, ou seja, passando parâmetros através de valores futuros, canais de comunicação, vamos falar bastante sobre isso.

E nesse papo, iremos acabar falando um pouco de sincronização de dados programação concorrente e, além disso tudo, otimizaremos um pouco nosso recurso para não utilizar mais do que o nosso computador tem a oferecer.

Além disso, no final de bônus, aprenderemos um pouco entre a diferença de programação assíncrona para programação paralela. Iremos até adentrar um pouco sobre controle de processos e não só "Threads".

Então nesse treinamento falaremos sobre bastante coisa legal, só que se nesse meio tempo ficar alguma dúvida, não hesite, você pode abrir uma dúvida eu tenho que responder pessoalmente sempre que possível, mas quando eu não consigo, nossa comunidade de alunos moderadores, até instrutores é bastante solista, então com certeza alguém vai conseguir te ajudar.

Mais uma vez seja muito bem-vindo e te espero no próximo vídeo para bate um papo bastante interessante sobre programação paralela com PHP.

Conceitos iniciais - Conceito de paralelização

Bem-vindos de volta e antes de colocarmos a mão na massa, antes de praticarmos o que realmente é programação paralela vamos entender o que é a programação paralela.

Vamos entender o conceito utilizando alguns exemplos do dia a dia. Primeira coisa eu sou sistema operacional que já faz muitas coisas ao mesmo tempo, e programação paralela é justamente fazer diversas tarefas, executar diversas tarefas de processamento ao mesmo tempo.

Nos dias de hoje isso significa literalmente ao mesmo tempo, na maioria das vezes. Então, por exemplo, vamos pegar aqui o número de programas que você tem aberto, você pode ter o seu navegador um sistema de arquivos aberto, talvez alguma coisa para ouvir música, então dessa forma vários programas já conseguem executar ao mesmo tempo

Essa é a lógica da programação paralela, mas quando falamos de estudar programação paralela, ou seja, criarmos algum programa de forma ele execute várias tarefas ao mesmo tempo, pensamos em várias tarefas dentro do mesmo programa.

Vamos pegar o navegador como exemplo, temos mais de uma aba, então isso já é um exemplo de mais de uma coisa acontecendo mesmo tempo, eu consigo interagir com duas abas, posso atualizar uma aba e interagir com outra, essas tarefas acontecem realmente ao mesmo tempo.

Eu consigo fazer o download de um arquivo, baixar uma arquivo em uma pasta qualquer, enquanto o arquivo vai baixando eu consigo interagir com outra página, ou seja mais de uma tarefa acontece ao mesmo tempo.

Imagina se não tivéssemos programação paralela, o que que ia acontecer? Primeiro eu só posso interagir com uma aba, enquanto ela estivesse carregando, enquanto alguma coisa estivesse acontecendo, não poderia baixar outro arquivo, não poderia acessar outra aba, então eu precisaria esperar essa aba terminar de processar tudo que tem que processar para que eu possa interagir com outra aba.

Outro ponto é que eu não conseguia fazer download enquanto mexo em uma página, então a experiência do usuário seria péssima. Mais um exemplo do nosso dia a dia, da vida real, é como funciona a internet em si, vou usar a Alura.

Estou acessando a Alura e você também está acessando, nós dois estamos ao mesmo tempo a acessando o servidor da Alura, que tem um sistema rodando e atendendo nós dois. Enquanto isso uma terceira pessoa também pode estar acessando um outro curso, talvez o mesmo curso e todas essas requisições estão sendo processadas ao mesmo tempo, agora imagina se nós não tivéssemos a programação paralela o que iria acontecer.

Eu ia acessar a Alura, e ai o site iria processar a página que eu requisitei, uma lista de cursos ou um guia de estudos, e depois que ela processasse, aí sim você conseguiria acessar o servidor. Depois servidor e Alura processasse a página que você pediu, a terceira pessoa, que também está se conectando, conseguiria acessar.

Imagina isso na web? Isso tornaria tudo que conhecemos hoje impossível, então programação paralela já é algo no nosso mundo, no nosso dia a dia muito tempo. Já convivemos com isso, mas não criamos programa de dessa forma ainda, utilizando o PHP, mas podemos criar.

Então, o foco desse treinamento vai ser te mostrar como realizar uma tarefa ao mesmo tempo, usando PHP. Só que vamos começar por exemplo da web, você provavelmente está se perguntando: eu nunca estudei, eu nunca trabalhei afundo, nunca mexi com programação paralela, ou seja, nunca disse para o “PHP para executar duas tarefas ao mesmo tempo”, mas mesmo assim o site que eu coloco no ar, os meus sistemas web recebem mais uma requisição ao mesmo tempo.

No próximo vídeo iremos entender a arquitetura do PHP, como o PHP funciona por baixo dos panos, na hora de receber uma requisição web, vamos entender o que que acontece e o motivo de precisarmos conhecer programação paralela, para já estar utilizando ela no mundo web, utilizando PHP.

Conceitos iniciais - Arquitetura PHP

Bem vindos de volta então vamos falar do exemplo da Alura, onde temos três ou quatro requisições entrando. Sabemos que é programação paralela é necessária para nós receber mais uma requisição e processar.

Mas como fazemos isso no PHP? Tente lembrar se, alguma vez, você programou o servidor do PHP? Você programou o código que vai receber requisição? O código que vai ficar ouvindo a porta 80 do "HTTP", por exemplo, para receber essa requisição, pegar informações e finalmente mandar para o código PHP executar?

Não somos nós que fazemos esse código, esse código já existe. Então como que funciona esse código? Quem recebe uma requisição, nesse mundo PHP? Como está processado? Como isso é controlado para finalmente executar o nosso script, o nosso código PHP em si.

Então peguei uma imagem de exemplo, deixa eu dar um zoom, vai ficar um pouco borrada, mas vai dar para entender. Um exemplo bem simplificado de como funciona por alto o processo do PHP.

Várias requisições vão entrar para algum lugar no seu no seu servidor, na sua máquina e o que controla essa entrada de requisições, ou seja, quem recebe as requisições propriamente ditas, são servidores web. Exemplo de servidor web que é "Nginx" outro servidor, não tão utilizado assim, é o "Apache".

Servidores web que vão receber requisições no, Windows é muito comum o "IIS". Servidores web vão ficar ouvindo a porta "HTTP” que é 80 ou “HTTPS” que, se não me engano, é 443, apenas detalhes de rede. Nós desenvolvedores e desenvolvedoras não precisamos nos preocupar, porque o servidor web já sabe fazer isso, ele já está configurado para ouvir uma porta, para receber essa requisição processar e mandar para alguém, e para que ele pode mandar?

Antigamente existia um cenário em que o servidor web mandava direto para o PHP, então executaria o nosso código e devolveria. Só que isso não era muito performático, existia esse problema de concorrência, toda essa tarefa precisava ser por programas externos enfim, era uma dor de cabeça relativamente grande, eram necessários módulos de execução.

Hoje em dia o que existe? Existe o "PHP-FPM" vou falar sobre ele superficialmente, já que esse não é um treinamento de infraestrutura, então não vou entrar em detalhes disso, mas basicamente "PHP-FPM" é um processo que recebe as requisições já do servidor web, ou seja, o servidor web passou aqueles dados que entraram em HTTP e mandou em um formato de algum servidor de aplicação, ou seja, o PHP ou no mundo Java, o Java em si, o dot.net. Algum servidor de aplicação saberia receber.

Então "PHP-FPM” vai fazer esse trabalho de receber essas informações, do que vai ser executado e controlar os processos e as threads, grave esse nome, os processos e as threads do PHP.

Ele vai gerar, baseado no número de requisições que ele está recebendo ao mesmo tempo, ele vai gerar alguns Pools de conexões. Basicamente algumas listas de conexões, vamos dizer assim, um controle que ele tem interno para que cada um desses controles consiga processar, consiga gerenciar algumas threads, algumas linhas de execução no nosso programa.

Uma thread é uma linha de execução, é algo que consegue realizar processamento lá no processador mesmo, na CPU. Então esse gerenciador do "FPM" vai executar threadse vão criar, e nessas threadss o PHP vai rodar com aquele nosso código, com o que nós estamos habituados a criar.

Ou seja, naturalmente, quando estamos criando um código PHP esteja configurado de forma moderna, obviamente, você ainda consegue configurar daquele modelo antigo que eu falei, mas quando nós trabalhamos com a configuração moderna estamos trabalhando com programação paralela.

O nosso código está onde na imagem aparece escrito "Execute", ou seja, nem sabemos se tem uma ou se tem quatro threads, se tem thread ou não, nem nos preocupamos com isso.

Agora o "PHP-FPM” faz esse meio de campo e cuida para que todas as todas as requisições possam ser atendidas ao mesmo tempo. Imagine que você tem um servidor com 20 núcleos ou dois processadores de 10 núcleos cada, ele vai saber gerenciar para conseguir executar aproximadamente 20 threads e cada uma dessas vai conseguir executar determinado número de execuções do PHP.

Então ele faz esse trabalho muito complexo que não é o que veremos, não vamos aprender a criar o tema "PHP-FPM" de novo, ou seja no mundo web do PHP, nós já temos programação paralela. Não ficaremos criando thread nova no mundo da web, não iremos e não podemos fazer isso.

Porque, pensa comigo "PHP-FPM" criou as threads necessárias, que cabem no nosso processamento, ele já cuida disso, para executar nosso programa. Aí imagine que estamos recebendo 1000 requisições ao mesmo tempo, isso é possível o "PHP-FPM” consegue se virar para distribuir entre todos os núcleos do nosso servidor e show de bola, está chegando lindo para nós.

Em cada um desses processos, em cada uma dessas threads, nós como programadores criamos mais de dez threads, então teremos mais 10.000 threads rodando no servidor, porque achamos que ia fazer nosso código mais rápido rodando de forma paralela no "Execute”.

Então isso não faz sentido, não criamos threadsno mundo web do PHP na mão. "PHP-FPN" cuida disso para nós e confiamos nele, porque nós sabemos que ele funciona e já tem muitos testes em cima disso, tem uma equipe enorme. Não faz sentido nós que estamos desenvolvendo um código em PHP interferimos no trabalho dele, que é um servidor de aplicação.

O que iremos aprender nesse treinamento é: fora da web, em processos que nós rodamos pela linha de comando tarefas agendadas, ou seja, tarefas que demoram um certo tempo para executar. Como que podemos ensinar o PHP a executar mais de uma coisa ao mesmo tempo, ensinar a ele executar várias tarefas ao mesmo tempo, como eu falei, em núcleos diferentes do nosso processador.

Vamos entender melhor com o passar do tempo o que eu quero dizer com isso e casos de uso próximos da realidade, mas basicamente por esse vídeo que eu quero que você entenda é: na web quando estamos criando processos, quando estamos criando código que vai rodar na web, não iremos pensar em programação paralela diretamente.

Isso já é feito para nós de graça, já está implementado, só usamos sem se preocupar com nada. Todos os treinamentos que você viu até aqui de web utilizando o PHP já podem fazer o uso dessa arquitetura paralela.

Com isso bem definido, vamos pensar fora da web, em processos de execução demorada, em processo que colocamos no "Cron", que agenda as tarefas, em processos que rodamos pela linha de comando e isso é muito comum no dia a dia. Iremos entender com o tempo e casos de uso. Mas, basicamente, recapitulando na web e isso é muito importante, na web não iremos criar threads na mão.

Sobre o curso PHP Parallel: Processos, Threads e Channels

O curso PHP Parallel: Processos, Threads e Channels possui 132 minutos de vídeos, em um total de 59 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas