olá pessoal fábio akita o episódio da semana passada foi bem pesado em conceitos estamos no nono episódio da série começando aos 40 e pizzolio 4 do tema the band ea segunda parte especificamente sobre concorrência e paralelismo avaliar eu tentei encurtar esse episódio mas vê ele vai acabar virando um dos mais longos da série de novo se você ainda não assistiu meus episódios anteriores do tema de backend eu recomendo que pausa e agora e vá assistir porque tudo que eu falei antes vai convergir hoje como eu já disse é um tema bem cabeludo e vamos tentar
desembaraçar os últimos conceitos que vocês vão precisar saber pra conseguir seguir com seus estudos sozinhos a pergunta que todo mundo fica na cabeça é qual das linguagens ea mais performática ou qual vai me dar a escalabilidade do whatsapp e ao mesmo tempo ser mais fácil de programar vários números podem parecer impressionantes muita gente adora repetir os x milhões de conexões simultâneas que um servidor do whatsapp consegue suportar e chegou à conclusão que não existe nada melhor do que ir lang esse número é bacana mas não é impressionante parem de se impressionar com números em contexto
e parem de ficar escolhendo tecnologia baseada em blog post ou palestras de engenheiro de netflix ou facebook é um absurdo sem sentido para pessoas que deveriam ter como profissão raciocinar com lógica e pintam comigo você não é o netflix seu produto que ainda nem saiu do papel não tem nenhum usuário você não precisa nem pensar na escala bilidade massiva do netflix que em horas de pico pode representar um terço do tráfego total da internet nos estados unidos quando alguém pergunta aqui tanto queria fazer tal coisa do facebook será que dá minha resposta é a mais
óbvia é claro que dá você está disposto a pagar o mesmo que o facebook pagou se sim então claro dá pra fazer igual ou melhor guardem esse pensamento eu ainda vou falar sobre isso em mais detalhes em outro episódio mas por agora só entendam essa verdade assim mil conexões simultâneas ou 10 milhões de conexões sua preocupação como iniciante está há milhares de anos luz de distância disso a tenha se a entender as tecnologias sem virar fã de marcas e ter metas fora da realidade [Música] já entendemos os mecanismos básicos de como conseguir ter concorrência e
paralelismo mas na minha opinião o real problema é coordenação não adianta nada você ter silício suficiente para executar milhares de tragédias em paralelo se você não consegue coordenar o trabalho dessas travis então se tiver uma única coisa que você precisa levar dessa série toda é que a coisa mais importante neste tipo de programação é conseguir a maneira mais simples e barata de coordenar tarefas concorrentes vamos voltar ao que interessa você é um iniciante finalmente entender os conceitos mais básicos de processos e travis aprendeu rapidamente sobre forte sobre cópia white que ajuda a economizar memória mas
você precisa entender alguns conceitos adicionais sobre coordenação agora a unidade mais simples uma cpu é uma instrução uma instrução em assembléia que usa como argumentos certos valores que você preenche em determinados registradores daí a instrução executa e o resultado é escrito pela cpu em algo acumulador ou outro registrador ele incrementa o contador de programa e vai pra próxima instrução é assim que a cpu começa a transformar o mundo ao seu redor tudo que você programa serve para pegar alguma informação que o mundo exterior vai te fornecer por exemplo que o usuário digita o programa e
você vai usar essa e outras informações para gerar algum resultado a programação é basicamente isso transformação de dados uma instrução simples de soma pega dois números que você armazena o em cada registrador a instrução executa o cálculo e transforma esses dois números no o único que representa a soma deles e gravar em outro registrador essa instrução é basicamente o que você chamaria de uma função toda a função recebe parâmetros ou argumentos de entrada processo alguma coisa e retorna algum valor de saída e você pode usar o resultado de uma função como parâmetro o argumento de
outra função e então vai encarar de ano uma função atrás da outra quando você manda o sistema operacional executar o binário do seu programa digamos um programa como o w ghetti ou crown no linux que você pode pensar como se fosse em navegadores web muito simples que rodam na linha de comando você normalmente passa um argumento um parâmetro no caso o rn de algum arquivo que você quer baixar você já viu ou vai ver um monte de tutoriais que usam um desses dois comandos para baixar alguma coisa o oeste vai fazer o que já expliquei
antes a lôca memória criar um processo isolado carregar seu binário e passar esse parâmetro processo esse processo vai executar no caso conectar um servidor que você mandou e baixar o tal arquivo e quando terminar o oeste vai descarregar e liberar os recursos e o resultado se tudo deu certo pode ser um arquivo gravado em algum lugar no seu sistema de arquivos nesse caso o programa funciona como uma função também ele tem uma entrada que a url que você passou de parâmetro e tem um retorno que foi o arquivo gravado ele transformou o url em um
arquivo em sistemas de unix ou linux os céus como best ou sh onde você roda na linha de comando permitem cadê a esses programas como se fossem funções quando seu programa carrega e vira um processo o sistema cria três canais unidirecionais um canal padrão de entrada ou estenderem o stb em um canal padrão de saída os thunder out oeste de alte e também o outro pra eu sou o sttrr na prática pensa que todo o processo pode iniciar conectando alguma coisa no stb e alguma coisa no std aut por exemplo podemos usar o tal programa
call para baixar um arquivo da web mas em vez de gravar em um arquivo local podemos redirecionar o conteúdo tudo baixado pra esse st de alte e conectar no std em de outro programa por exemplo um programa como o famoso grep que filtra texto para fazer pesquisa quando ensinei sobre processos eu já expliquei que o processo só bem em espaços isolados de memória e o código interno do processo não interfere no espaço de memória de outro processo o que eu acabei de falar sobre encadear processos e direcionando o st de alte de um no std
in do outro usando o que chamamos de pai pis é a primeira forma mais simples de comunicação e portanto coordenação entre processos mas não é o único e nem necessariamente o mais útil porque você só liga o final de um programa ao começo de outro programa e esses canais só tem uma direção ou seja o primeiro programa é quem manda coisas para o segundo programa mas não o posto sem entrar em muitos detalhes hoje existem outras formas de um processo se comunicar com o outro como eu já disse antes existem os sinais como o seguinte
e você pode codificar seu programa para ignorar isso ou fazer alguma coisa quando recebe esses sinais o eventos novamente é mais uma forma rudimentar de comunicação uma terceira forma é que dois processos abram o mesmo arquivo daí um deles pode escrevendo uma nova linha de cada vez nesse arquivo e outro pode ir lendo essas linhas novas expandindo nessa ideia de um arquivo comum entre dois processos o sistema operacional oferece outra opção os fios que se você estudou alguma coisa de estrutura de dados funcionam como uma fila fest in first out ou seja o primeiro elemento
que entra é o primeiro elemento que sai você pode abrir um fifa e dá o nome e abriu mesmo fifa a partir de outro processo é quase como se fosse um arquivo agora os processos podem se comunicar e as aecs estrutura damos o nome de neymar e de pai pixar vamos de pai porque é como se fosse o cano mesmo passando informação de um lado para o outro eles são limitados como os pai pitt simples ou arquivos um dos processos abri o nome de pai pra ler e outro para escrever e por isso também unificação
sofrem uma direção em todos os exemplos um dos processos serve de produtor de alguma informação e outro processo serve de consumidor dessa informação e o mecanismo no meio seja um arquivo ou name the pipe serve meio como uma fila eu acho que o mecanismo mais simples de comunicação entre dois processos é uma fila e o sistema operacional já oferece mecanismos faz décadas porém no nosso mundo de web internet e programas que funcionam como servidores que seriam os produtores e programas que funcionam como clientes que seriam consumidores esses mecanismos não funcionam tão bem porque não se
comunicam pela rede mas mesmo na mesma máquina sem depender de rede podemos simular a comunicação entre um servidor e múltiplos clientes usando name the path ou arquivos porém cada novo cliente conectado no servidor exige um novo nome de pai piorou arquivo por isso existem os hockets no caso da internet falamos sobre sócrates de ip que trafegam pacotes no formato ter cp uma das vantagens de usar sockets é que o programa servidor se liga a uma porta no sistema como já expliquei e aceita conexões de múltiplos clientes mas diferente de arquivos ou nome de paz o
servidor só precisa se comunicar através de um único socket a partir de onde ele vai aceitando as conexões de múltiplos clientes além de só precisar de o único só que para abrir esse canal a comunicação é bidirecional então o cliente também pode enviar dados por servidor e vice-versa eu mesmo só que ti no caso de unix e linux além de um soft p existe o que chamamos de unix sócrates eles têm propriedades parecidas com sócrates de ip mas só serve para processos rodando na mesma máquina já que não é um software de rede é a
maneira preferida de fazer dois processos se comunicarem de forma eficiente porque você só precisa de um sócrates no processo o servidor para atender múltiplos outros processos clientes que normalmente chamamos de workshops e ele abre um canal bidirecional diferente the name the pips no episódio anterior eu expliquei como o servidor jennex tem um processo master que serve como um servidor e ele cria diversos processos workers e claro eles se comunicam entre si via e unix sockets canais versáteis bidirecionais é como outros servidores que geram fox e um work fazem para seus processos coordenar entre si como
um possíveis ou mais kelly no mundo web onde hoje temos hospitais micro serviços eles são basicamente processos programas servidores que se ligam a uma porta de rede e abrem só que esse ip aceitando conexões tcp e em particular oferecendo comunicação de o protocolo http mas na prática são processos que se comunicam via sockets basta você entender em que sócrates em particular socket ip obrigam o processo se ligar a uma porta e são canais bidirecionais de comunicação em unix com o psd ou cores como yunes podem ser únicas sockets para a comunicação de processo na mesma
máquina ou socket ip para a comunicação de múltiplas máquinas numa rede tcp/ip e no nosso mundo web essa comunicação normalmente se dá através do protocolo http mas não é uma obrigação podemos ter outros protocolos mais eficientes como protubo fi ou protocol buffers que é um protocolo em formato binário que é mais eficiente que o http que é um protocolo texto e o protocolo foi inventado pelo google aliás lembra que protocolos binários sempre são mais eficientes que protocolos em texto e pelo simples fato que texto ocupa muito mais espaço a explicação é muito simples num computador
representamos tudo no formato binário 10 você já deve ter aprendido isso então resume muito rapidamente um byte são 8 bits em um byte você pode apresentar números inteiros de 0 255 e porque 245 porque 2 elevado a 856 o número como mil cabe perfeitamente em dois bairros foi representado binária mente mas se você preferir mandar o número 1000 como um texto e isso seria um texto de quatro caracteres em um sistema moderno que reconhece une code utf-8 cada letra precisa de dois bairros ou mais existe uma tabelou na que mapeia cada caractere de cada alfabeto
do mundo o código em alfabetos ocidentais um bike já resolve mas candies de japonês precisa de pelo menos dois bairros por exemplo mas no caso do texto mil que é o 10 000 são pelo menos quatro bairros em resumo o número puro sozinho em binário cabem dois bailes mas sua representação em um texto precisa de quatro bailes ou seja o dobro do tamanho e iniciantes têm dificuldade de entender isso mas comece decorando o número inteiro mil é um elemento totalmente diferente do texto de quatro caracteres mil isso fazia mais diferença numa época onde as redes
eram extremamente lentas e hoje você não pensa muito nisso porque qualquer um pode ligar nas portarias de uma net ou vivo e pedir à internet de 50 mega bits teórico ou mais mas se você tem um sistema que trafega milhões de gibis por ora todo bate faz diferença por isso pra muita coisa o google usa o próprio bufê ibge http em seus sistemas para o seu dia a dia não se preocupe tanto http tá de bom tamanho mesmo porque hoje sabemos comprime texto com algoritmos como gesipe que podem derrubar o tamanho de um texto longo
até menos de um décimo do seu tamanho mas isso é assunto para outro dia eu também expliquei tudo isso porque a comunicação entre dois processos usando um protocolo pesado como http sobre tcp/ip passando para o soft que seu programa se conecta vai precisar fazer uma coisa chamada marcha nem ou serialização ou seja internamente no seu programa o dado digamos o tal número 1.000 puro está numa variável que provavelmente o inteiro de dois bailes mas quando você enviar para fora do seu processo como a exigência é o protocolo http você vai ser realizar ou seja transformar
o número inteiro para o texto e cuspe pelo socket do outro lado um outro processo o cliente vai receber esse texto e vai ter que converter de volta para o inter ou seja de ser realizar o dado muitos dos bugs modernos em micros serviços ou seja comunicação de processo através de http vende erros nessa conversão e desconversão fica esperto com isso mas eu estou me adiantando tudo isso foi para explicar as diversas opções que existem para a comunicação entre processos você tem coisas muito simples como pai pois nem de pai pis arquivos e unix sox
e até socket ip para fazer um programinha besta que só roda localmente falar com o outro programinha que também sua roda localmente na mesma máquina obviamente usar um protocolo como http é dar um tiro de canhão para matar uma mosca é descomunal e ineficiente na pior das hipóteses você vai querer usar um unix sócrates se você programa em si existem bibliotecas como o pmpi o pmp para facilitar programar comunicação inter processo na mesma máquina ou mesmo entre diversas máquinas entendido como o processo se comunicam vamos entrar dentro de um processo e falar de travis eu
já expliquei nos episódios anteriores que uma tragédia tem acesso a toda a memória interna do processo então se uma tragédia precisa se comunicar com outra até tragedy eles podem basicamente compartilhar uma mesma estrutura de dados no caso de ser digamos um a rei ou uma lista ligada como fica tudo no mesmo espaço de memória não existe a necessidade de usar mecanismos fora do processo como um nome de pai pyunik sócrates porque você acessa o dado diretamente no endereço de memória virtual do processo mecanismos externos que eu falei antes existem porque o processo não enxerga nenhum
endereço de memória externo ao seu espaço virtual alocado para o sistema operacional por isso comunicação entregues é o ordens de grandeza mais eficiente mas com essa eficiência vem todos os problemas de mottek semáforos bugs de race condition e desde logo que eu já expliquei antes programar contradiz é um processo que tem que ser extremamente cuidadoso da parte do programador o sistema operacional não têm como se proteger e você precisa garantir que uma tragédia não vai escrever em cima do mesmo endereço onde já tem outra tragédia escrevendo ao mesmo tempo um sistema que só opera com
uma tragédia real esse problema meio que não existe porque o esquerdo do sistema operacional vai deixar só uma tragédia e realmente rodar ea outra precisa esperar fez o tal do times light que eu já expliquei mas em máquinas com dois corpos ou mais realmente duas tradings podem estar rodando exatamente no mesmo instante com paralelismo real e aí que os bugs que eu falei podem acontecer como eu disse antes o problema todo é coordenação para piorar vocês vão notar que existe a cpu com seus cortes reais o hardware de silício que rodam três reais uma por
corte existem as três que o sistema operacional organiza e gerencia o tal esquerdo ler do sistema operacional como cfs do linux tem acesso a esses cortes físicos mas os programas podem mandar criar 100 linuxtrends então numa máquina intel e cinco da vida com o code corre por trad existem 83 reais que podem rodar em paralelo em cada determinado instante mas o sistema operacional pode gerenciar centenas ao mesmo tempo fazendo seu esquerdo e dando um pouco de tempo para cada uma fazendo tal conta que suíte que eu já expliquei tirando as coisas da mesa de uma
tragédia e colocando as coisas na mesa pra outra tragédia e dando vez pra ela pra gerenciar essas tragédias fazer o tal com text suíte o sistema operacional precisa guardar o tal contexto e memória para cada tragedy eu já disse que uma tragédia vai gastar pelo menos 1 mega de memória então quanto mais três você criar mais memória vai gastar pior quanto mais trânsito você criar maior o corpo trabalho the context e pior ainda quanto mais três você criar maiores as chances de seu programa até aqueles bugs por não ser 36 efe existe ainda outro agravante
cria transe é uma atribuição do sistema mais especificamente da canon para seu programa pedir pra querer eu queria três você precisa fazer system cos as escolas que eu já falei isso também não é barato aliás se você não sabia vale definir você pode pensar que a queda do linux os drivers programas que vem uma distribuição e os próprios programas que você escreveu é tudo a mesma coisa são todos binários que rodam na máquina se você fez o que eu recomendei estudou um pouco de linux você sabe que existe o comando sudo o comando que escala
seu programa para rodar com permissões de ruth o administrador da máquina nesse caso você sabe no mínimo que existem diferenças entre rodar como o usuário normal ou rodar como ruth que têm acesso a tudo mas na verdade o hulk não é a coisa mais poderosa do sistema o kernel é que é no final das contas é o quer no que decidiu que o ruch pode ou não pode fazer então se você só chegou até o último center outra coisa a única coisa que têm acesso irrestrito a tudo da máquina todos os dispositivos toda a memória
pode executar qualquer coisa é a canon na arquitetura de processadores e então existem quatro anéis de permissão à carne o buta e roda do chamado gangue 0 o anel 0 dentro desse anel qualquer código tem acesso a tudo todos os seus programas inclusivos que rodam via sul do rodoanel 3 o mais restrito de todos é onde rodam os seus programas e nos anéis um e dois rodam os drivers e coisas de virtualização por exemplo o virtualbox carrega quer no do oeste que ele vai mudar no anel 11 no anel 3 várias instruções de à sempre
da máquina não funciona como instrução que muda de anel obviamente ou instrução hnt darolt e para a máquina os u2 simplesmente libera mais system kols para a canon mas o programa ainda vai ter que fazer se tem couro e pedir coisas pra kernel num processador arm também existem ringues mas a numeração é ao contrário o que ele chama de l0 é o equivalente a us zeland ou brinde 3 da intel l1 é onde roda quero o mais importante é entender que existe user land que é onde rodam todos os seus programas e quer nem os
peixes se onde roda a canon a única entidade que tem real acesso a todo o sistema chamar uma função dentro do seu próprio processo é extremamente barato chamava-se skol é mais ou menos como chamou a função em outro processo então você pode imaginar que vai acontecer algo parecido com o contex uit toda vez fora isso existe um salto de privilégio do ringue 3 por ming 0 tudo isso custa e rock são micros mundos a mais toda vez mas pense um servidor web contradiz com milhares de usuários pedindo requisições http e seu servidor criando trade para
cada uma e matando todos que vão acabando milhares por segundo milhares desses corpos por segundo agora as coisas começam a ficar caras não tem nada mais rápido do que código que roda dentro do seu processo por isso você quer evitar fazer se escolas ao máximo que puder criar milhares de processos ou milhares de 3 custa memória custa com text suíte custa escalar privilégios entre ringues e parece que o povo do dj s então estava correto usar ou assíncrono certo calma aí eu assíncrono e 20 looks ou o ex é só uma forma rudimentar de concorrência
e sistemas que não suporta outros mecanismos como tradings e justamente javascript não suporta hatred ele é mono trade ou single trad então a sua única opção é usar o intervalo entre atividades de e mail como arquivos ou soft para tentar fazer alguma coisa mas é muito pouco eu já expliquei uma das soluções do episódio anterior é fazer o que o imd next pais múltiplos processos na média um pra cada corda sua máquina ou seja um processo para cada trade e cada uma delas com um reactor para aproveitar as chamadas de a eu costumo gastar tempo
para completar a grande vantagem num sistema acumulou djs que é um processo de um único trade é que você tem alguma concorrência graças às escolas de haia 5 do sistema operacional e pelo menos não tem que lidar com as dores de cabeça de muteka e buggys de sincronia como race conditions oded locks imagina o inferno extra que a ser java script além de tudo ainda tivesse que lidar com mais esse tipo de categoria de bugs interpretadores que dependem bastante do sistema operacional por baixo como python ruby possui entregues reais porém existe um grande problema para
ter boa performance eles de legam muita coisa pra modo os inscritos devem ser os aip uma das bibliotecas científicas mais famosas do mundo python é quase inteira escrita em fortuna e se transpôs por isso é veloz só uma casca é escrito em python s extensões ganham acesso às estruturas de dados e interna dos interpretadores é como se fossem parte do interpretador agora vem o grande problema elas não são necessariamente 36 na verdade a maioria não é que você não tem como saber por causa disso as tragédias de python e rubi apesar de mapear para tradings
reais do sistema operacional e terem a capacidade de rodar em paralelo acabam bloqueadas por locke gigante do interpretador que justamente ganhou o nome de global intérprete berloque ou gil com exceção de chamadas de ayew que conseguem rodar realmente em paralelo às trevas do interpretador são bloqueadas por causa da tal gil elas ainda são úteis mas não tanto quanto uma linguagem que não tenha um gil na prática assim como java script tanto python quanto ruby acabam sendo essencialmente single fred com algumas exceções como operações de ai ou cones deles como o pai pai ou de ruby
como não precisam manter compatibilidade com extensões em c podem desligar o gil e usufruir de r$3 assim como no djsi em 2009 eu já expliquei como twist de 2002 entao gil elas a adição de colocar um evento em loop numa trade para atender milhares de requisições de ayew há cinco anos e usa o intervalo enquanto espera essas chamadas completarem para executar alguma computação e assim ter o jeito rudimentar de concorrência obviamente isso tem duas desvantagens a primeira é que basta você fazer uma computação que demore demais e o evento em loop inteiro é bloqueado mesmo
que a chamada de a eu já tenha terminado já que roda tudo na mesma tragédia ea segunda desvantagem é que sua aplicação precisa ter muitas requisições de abril para compensar ou seja é melhor se usado em servidores de rede como um servidor de aplicações web esse modelo não funciona para programas que são pesados em computação só por isso no djsi o twitter que são indicados para aplicações web no mundo ruby temos opções similares como o evento machine ou mais recente assim que no mundo python depois do twitter também foi criado o tornado eo g20 as
mais modernas na prática é a mesma solução em todos eles o evento em loop rudimentar que chamamos de hector que é gerenciado numa única tragedy intercalando se escola há cinco anos de alho ou executando algum código nos intervalos do ponto de vista da programação do código temos um problema a forma como esse programa o event lupi é fazendo uma chamada de função assim cana e passando como parâmetro uma segunda função que deve ser chamada quando o avaí ou acabar por exemplo uma função de ler um arquivo de template de html na máquina recebe de parâmetro
uma segunda função para preencher esse template geral html final no sistema single tragédia de contudo bloqueante você escreveria essas chamadas de função lá em baixo da outra mas num sistema orientado a eventos você precisa passar as funções subseqüentes uma como parâmetro da outra e isso cria um rumoroso padrão de cascata ou que eu gosto de chamar de errado quem de funções se você vê algo assim hoje em dia é um jeito antigo de escrever é hediondo e não a ser vivo no planeta que veja algo nesse formato e não se imediatamente vontade de vomitar um
pouco na boca nos seja tínhamos algo parecido mas não necessariamente só para a concorrência é o conceito de passar o ponteiro referência de uma função com o parâmetro de outra função chamamos isso de col becks interfaces gráficas e vb delphi ou java suingue também tinham esse conceito com líderes por exemplo é um jeito rudimentar desse encadear funções onde uma depende do resultado da outra dentro de um evento em loop toda a interface gráfica é basicamente um loop também na prática você tem o callback pra quando tudo dá certo em outro callback para quando algum erro
o twitter do python introduziu o conceito de códigos de fred em vez de chamar uma função você cria um objeto que pode ser em cadeado esse objeto basicamente engloba a tal chamada assíncrona por exemplo e você pode configurar esse objeto chamado métodos como a de kholbek é quase a mesma coisa que antes mas como estamos em cápsula da função um objeto ele fica um pouco mais maleável de se trabalhar no seu código sem precisar virar um koubek réu honrado que falei antes no mundo web o freiburg g com ele adicionou a mesma construção com o
mesmo nome de ford assim você pode configurar uma chamada ajax e conectar col becks na prática você encapsulou uma chamada assíncrono objeto que você vai deferir a execução para algum ponto no futuro normalmente depois de ter a oportunidade de configurar esse objeto com o codex ou esperar outros de fãs ficarem prontos e executar tudo de uma vez só por exemplo de qualquer forma é uma forma melhor do que ter a dupla indicou becks retomando fazer esse escolas é caro com o text suíte é caro chamar coisas funções dentro do próprio processo é rápido e barato
dentro do seu processo existe seu código transformado em binário e você tem suas funções lá funções que demoram demais para executar bloqueiam todo seu processo outred e se fosse possível pausar uma função antes dela acabar deixar ela de lado e dá chance de outra função rodar dentro do mesmo processo e eu não estou falando de criar duas tragédias eu tô falando de na mesma tragedy a função ser pausada deixa outra executar e daí voltar a executar a primeira é como se fosse uma tragédia mas como é tudo dentro do mesmo processo sem se escols sem
contacto it é para isso que serve uma com rotina pense uma função com múltiplos pontos de suspensão que você pode pausar e continuar o resume depois em particular um caso especial de colatina se chama fiber ou generator se você já brincou com classes d/e número de eleitores o iter heitor em python o lube sabe para quê ela serve a ação basicamente funções ou métodos como qualquer outro mas dentro desse método faça de conta que existe um loop gigante indo até o infinito significa que esse método é book a tudo e você não vai rodar mais
nada pra sempre mas de dentro de si lupi você pode chamar uma função normalmente nomeada como humilde que vai devolver o controle para o código anterior que chamou método agora esse código anterior pode executar outra coisa e quando quiser pode chamar o método resume para resumir a execução desse método com um clube gigante ele vai dar e eu de novo e assim por diante se você lembra de quando eu falei do windows 3.1 isso seria algo parecido como a multitarefa cooperativa fiber são funções ou objetos de execução onde você codifica poucos de suspensão o pausa
da execução a maioria das línguas atuais têm algo assim os nomes vão variar mas você vai você pode ouvir com rotina fabril generated é basicamente a mesma coisa payton tenho um clube tem javascript tem suíte tem quatro inteiro todo mundo tem algo assim de qualquer forma para que servem essas com rotinas que pausa e podem ser resumidas se elas não rodam em paralelo em princípio elas se parecem contradizer elas estão dentro do processo portanto têm acesso a todas as estruturas de dados do processo porém como as não rodam em paralelo não existe a situação de
uma querer escrever em cima dos dados da outra você que tem que manualmente pausar e manualmente resumir uma fire portanto você tem controle por isso elas são mais simples de se trabalhar do que travis mas elas não roda em paralelo então se parecem mais com as trevas de python ruby que apesar de terem a capacidade de rodar em paralelo já que mapeiam para travis reais sistema operacional existe o gil que vai bloquear mais diferente de travis não precisamos de chamadas para a canon elas são sempre as abstrações dentro do seu programa em user land a
existência dessa construção da linguagem facilita a programação de concorrência eu não disse que a forma rudimentar é uma função recebendo call becks pra chamar outras funções quando via o evento que determinado a eu finalizou depois inventamos de fãs que já ajuda porém podemos usar fiber para escrever o mesmo código que seria um hadouken dia call box quase como se fosse programação imperativa tradicional só que une hoje bloqueia até a chamada voltar e daí ele resume daquele ponto então veja o exemplo como é um código hadouken agora veja o mesmo código usando fighters ea chamada de
yudi e você vai ver como depende do ponto de vista do código tudo ficou mais simples e seqüencial então só por isso já temos um ganho absurdo elegibilidade por consequência manter na habilidade do código do ponto de vista do código se somarmos o evento em loop com ayew a synchro conseguimos ter algum nível de concorrência e com firewalls conseguimos ter um código que não há tosco estamos chegando em algum lugar aqui com isso java script cloud js python conclui se tornando o g20 clube com o evento machine ou assim que todos têm a possibilidade de
usar essa arquitetura de hits porque no fundo quem realmente faz a mágica é a queriam e suas escolas há cinco anos como epóque que o while cip porém todas as bibliotecas que fazem chamadas síncronas ou seja do jeito bloqueante precisam ser reescritas para usar esse recurso de fibras ou generator daí você entende porque em python ruby e suporte é mais complicado porque no djsi é mais fácil porque o node já nasceu com suas bibliotecas sendo criados para serem assíncronas isso ajuda e linguagens que têm dificuldades com paralelismo de r$3 vamos falar das que têm acesso
a créditos reais sem o problema de um gil o loc global como java ou sharp pra elas existem três de pulsos em vez de ficar criando 500 travis a torto ea direito sem controle você limita quantas travis vão de fato existir simultaneamente como eu já disse antes uma média de uma tragédia por corda máquina tanto em java quanto sharp elas costumam ter alguma coisa como uma classe trash um literalmente um tanque de thrash e melhor ainda quando tem outra abstração chamada teske ou tarefa a grande vantagem você vê no loop em uma lista gigante onde
você quer processar cada elemento dessa lista em paralelo só que se você ficar criando uma tragédia para cada elemento ele se tiver 500 elementos você vai acabar te as 500 tragédia o sistema gerenciar ao passo que se você usa tas que é só uma abstração e configurar trade poupar até sua 53 diz mesmo a lista tendo 500 elementos você nunca vai ter mais que 53 rodando ao mesmo tempo uma tragédia e põe um funciona como se fosse um load balancer de 3 vamos dizer nós usamos o conceito de um em tudo que é recurso caro
por exemplo bancos de dados nós usamos connection pulso mesmo se tiver 500 navegadores simultaneamente conectando o servidor de aplicação não vamos abrir 500 conexões no banco vamos configurar um pude conexões para digamos sem conexões e é só isso que vai existir os primeiros 100 bom usar essas conexões quando o primeiro acabar ele devolve a conexão propo e agora o próximo esperando vai pegar e usar e assim sucessivamente a mesma coisa entrega de pulsos e esse é um dos principais conceitos que você tem que saber em arquitetura de concorrência paralelismo uns e filas é como uma
agência de banco é dia de pagamento 100 pessoas aparecem na hora do almoço mas só vai ter dez caixas as dez caixas representam o pum e assim vamos ter dez pessoas sendo atendidas simultaneamente e as outras esperando na fila é assim que o esquerdo ler de travis funciona também e é assim que podemos ter algum controle sobre as trevas do sistema operacional no mundo dot net você tem clássico com o paraná léo e task que abstrai esses conceitos em um clube também temos uma biblioteca chamada para léo que vai abstrair pulos de fox o pulso
de travis do mundo de mac psd existe um grande central desperte e seus dispatch kills enfim cada linguagem o sistema operacional vai oferecer alguma coisa que tenha essa arquitetura alguma combinação de kills ou fila e pulsos preste atenção você raramente que os atraentes reais diretamente especialmente em grandes quantidades se precisar de travis sempre use uns quilos e tasks esse conceito também se estende para a computação distribuída até agora sempre falamos de um co digo que na hora que precisa carrega alguma forma de executar uma tarefa em paralelo ou um forte para gerar um novo processo
ou criando uma nova tragédia ou agora criando uns mas existe a opção de já ter essa segunda entidade pré-carregada esperando um segundo processo ou uma tragédia ou algo assim em java sempre tivemos o enterprise edition os jms ou java message service no mundo ruby on rails usamos coisas como sair de que a aplicação conecta a uma fila representada no banco de dados redes e existem um ou mais processos que ficam pré carregados e ouvindo nessa mesma fila chamamos esses processos secundários de works temos isso em quase toda linguagem uma fila e vários workshops e como
há um número limitado de works é como se fosse um puto também do mundo.se net temos opções com o projeto hands and fire no mundo python temos projetos como série ou r 15 mil no mundo novo js temos coisas como o kil no mundo java temos mestre de que o jr o background jobs no spring o conceito é sempre o mesmo algum tipo de fila como rabbit me kill redes ou qualquer coisa assim e diversos workers consumindo dessas filas é uma solução de paralelismo que funciona tanto na mesma máquina quanto em diferentes máquinas representando um
tipo de computação distribuída outro nome que você vai ouvir associado a esses mesmos conceitos são background jobs esse tipo de solução resolve a grande maioria dos problemas reais que temos hoje mesmo uma aplicação single trad que tenha um reactor ainda temos operações que custa o tempo e processamento que eu já expliquei que vão bloquear o evento lupi em vez de executar isso no processo principal podemos enviar uma mensagem a uma fila e deixar outro processo o work fazer esse trabalho pesado e assim deixar o iefp o principal mais leve e mais rápido mas ainda assim
gostaríamos de alguma coisa mais eficiente dentro de um mesmo processo e até agora não chegamos lá ainda mas se você prestar atenção aos episódios anteriores existe sim uma construção a definir concorrência e sistemas operacionais e hardware que não tem mais do que uma tragédia real seria uma grua entregue ou seja uma tragédia que só existe em user land e não em quer nos ps é o protótipo do java original tinha no começo quando foi desenhado para os set top boxes tipos tipos como eu expliquei em outro episódio um conceito de hardware barato do começo dos
anos 90 que não mudaria nada muito mais potente que um dós se quiséssemos programar a concorrência não haveria três reais mas mesmo assim podemos programar a concorrência com green trades só que elas vão rodar em paralelo lembram uma coisa é ter concorrência outra coisa é ter paralelismo de paralelismo implica concorrência mas não o posto com rotinas fiber sou generator que eu expliquei antes seria o mecanismo para chegarem entregues funções com pontos de suspensão onde podemos gerenciar várias delas ao mesmo tempo e executando um pouco de cada uma de cada vez à primeira vista hoje que
temos máquinas multicor com múltiplas travis com paralelas que são reais pra que serve um grito fredes e para muita coisa eu já repeti várias vezes e vou repetir de novo fredes custo memória talvez 1 mega em contacto it caro executado pelo scanner da queda ontem se escolas que precisam pular de usar além de praticar nos pés se green tradição baratas dependendo da linguagem pode custar talvez na ordem de 2 quilômetros ou seja umas 500 vezes mais leves que uma tragédia elas estão dentro do mesmo processo em usar land não depende desses costa nem the context
suíte da queda ou seja comparado contradiz elas são realmente muito mais baratas mas tem um problema só com o que sabemos até agora elas não rodam em paralelo aí que você se engana e se usássemos o conceito de três tipos e fizéssemos um código que pegasse milhares de green trades e mandássemos executar num pude tradings reais basta construirmos o esquiador em user land que se encarregaria de fazer esse load balancing de green trades entre tradings não po e muito bem chegamos à base de uma escala com julgou erlang por conseqüência elixer erlang nos anos 80
fez o seguinte quando sua v m bin sob eles seqüestro os recursos da máquina pra ele olhou a memória e principalmente as tragédias reais do sistema operacional ele roda o esquelo em uberlândia para cada tragédia real as funções em erlang não são só fibers relação com rotinas e avm tem o poder de arbitrariamente para usar uma função quando bem entender ou seja ela não depende que você tenha programado um nilde na função para devolver o controle ela vai para usar quer você queira ou não exatamente como a perna do linux faz com seus programas ou
seja o erlang implementa o equivalente a um esquete ler preemptive wu de green entregues em 10 land e em vez de fiber cela tem como rotina de verdade mas o e lang tem algo mais importante ainda um dos problemas de uma tragédia é que se ela tem problemas exceções erros e outros bugs ela pode corromper toda a memória do processo então basta uma tragédia e fazer bobagem seu processo inteiro pode crachá para evitar isso erland resolveu que cada uma dessas suas com rotinas não compartilhassem nenhuma memória com outras rotinas na verdade para dificultar nosso vocabulário
dentro do irlandês chamas com rotinas que estão executando de processos não confunda com o processo de verdade de um linux apesar do comportamento ser similar existem funções normais como de qualquer outra linguagem mas existem esses processos de erlang como esses processos não enxergo memória de outros processos se você quiser fazer um processo se comunicar com o outro temos o equivalente a um unix sócrates se fossem processos de linux canais bidirecionais por onde eu posso enviar mensagens essas mensagens são estruturas de dados de novo não compartilhadas a vm do ernani assim como o s n no
xxix a louca espaço de memória protegida para cada processo mas diferente da carne ou linux que coloca um mega para a estrutura de um processo ou fred ouro não precisa colocar mais que 2 que o bate pra cada processo o processo vai recebendo mensagens no meio boxx um tipo de fila e escolhe o que fazer com essas mensagens quando quiser quando um processo termina o cara cheia existe um gargalo de colector para cada processo individualmente e isso pra mim é o que diferencia lang de todo o resto um processo que é um grid com o
bang não afeta e nunca corro com o resto do sistema já que ele não compartilha nada eles não compartilham ponteiros nem nada e por isso nunca tenha capacidade de desestabilizar o sistema por isso eu costumo dizer que a v m bem do orlândia é quase como se fosse um mini linux para ficar mais similar ainda os linux tem um processo master que dependendo da distro pode ser um limite de ou se estender o outro que sobe demos que já expliquei antes são processos especiais serviços do sistema no erlang temos a mesma coisa só que se
chama os supervisores ele se encarrega de quando você subir sua aplicação no boot da vm2 lang vai subir os supermaiôs que vou iniciar os processos necessários e garantir que se um deles crashar ele vai subir um novo lugar eu expliquei em dois minutos o irlandês mas pensa em erlang mais comum java uma máquina virtual que oferece diversos serviços incluindo coisas que eu já vou dot net não tem esquerdo e processos esses processos em dublin entregues tudo rodando em uberlândia e por isso extremamente barato é tão barato de fato que podemos fazer o que eu expliquei
que fazíamos antigamente toda nova conexão de rede antes a gente gerava uma tragédia real para lidar com ela mas com os e 10k descobrimos como é caro e não escala fica criando três reais o tempo todo pra toda a conexão 10 mil teds consumiria 10 gb de ram mais 10 mil processos gerland consumir só 19 megabytes portanto com essa greve entregue é ordem de grandeza mais barato podemos voltar a criar uma grande tragédia e por conexão se quisermos entender a diferença do entregues são ordens de grandeza eficientes que uma tragédia real e se a máquina
virtual tem seu próprio skewer para gerenciar atrás de real para o dazzboard entregues temos paralelismo de verdade no java normal não temos essas construções mas outras linguagens por cima do java como escala e cojur implementam estruturas similares de green transe sketchers em particular o scala introduziu freimark aca por volta de 2009 que implementa a arquitetura de hector hector é como eu chamo essa função especial no erlang os processos que têm características de cor rotinas com múltiplos pontos de suspensão com meio boxx que servem como filas de comunicação e outras mensagens trocadas entre processo não compartilham
memória nunca trafegam coisas como ponteiros mantendo-as green trad isoladas entre si isso é um hector basicamente por isso tanto erlang quanto escala compartilham de arquitetura similares apesar das linguagens em si serem bem diferentes o jonas boné criador do aca se inspirou diretamente no erlang para fazer o framework do scala por isso eles têm conceitos similares lembro quando eu expliquei que os esquiadores de thrash de linux e próprio suporte de pt eram ruins no linux que só depois 2007 naquela 2.6 que ganhamos o npt l e os fs do igor molnár eu expliquei que o sistema
operacional map uma estrutura de trade para cada cor real do hardware o tal modelo um para um mas se você adicionar um scanner e múltiplos green fred em usar land voltamos ao modelo de m pra n que eu disse que a ibm tentou implementar no linux com o projeto ng pt lembram que eu falei pra vocês guardar essa informação estamos revisitando o tema agora um gol faz mais ou menos a mesma coisa o que o irlandês chama de processo em gol se chama gol no time só que eu diria que as golo times são mais
baixo nível do que o hector de escala num erlang assim como no linux cada processo ganha um pid o próximo a sair de um número que identifica unicamente cada processo rodando esse pib serve como um e meio e um processo pode mandar mensagens para o outro acesso através de se pedir o e lang é tão versátil que podemos mandar mensagens para um pedido de um processo em outra máquina o gol tem uma outra abstração as chamam os literalmente canais duas gotinhas podem compartilhar uma mesma chamam uma rotina escreve no chão ano ea outra rotina pode
ficar escutando mesmo tiano lembro de algo similar que expliquei hoje na prática não me parece nada muito diferente de um name the pipe entre processos e unix o canal unidirecional bloqueante e eu disse que gol o time da cet a noção mais baixo nível que hector gerland ou escala porque esse permitem trafegar qualquer coisa incluindo ponteiros de memória ou seja eles compartilham memória entre si e portanto têm os mesmos problemas que programar contradiz reais se você escolher trafegar ponteiros vai precisar lidar como tex e loks e os temidos bangs the race conditions in bed locks
diferente de lang ou java um gol não é uma máquina virtual cheia de serviços a filosofia os usos são diferentes ele tem um fantasma e por causa do controle das rotinas que podem rodar em paralelo diferente do esquiador dyer lang que é pretinho wu o esquiador digo é cooperativo ele espera determinados eventos numa rotina como se escols para receber o controle de volta e da vez pra outra rotina é menos sofisticado do que lang nesse caso mas é mais leve e mais previsível também obviamente por causa disso ele é automaticamente mais poderoso do que no
djs e mais simples de programar aplicações complexas assim como ela ganhou escala um reactor é desnecessária porque eles têm esquerdo mas que podem causar uma rotina quando alguma coisa como arriou bloqueante é executado na minha opinião esquiadores em uberlândia para com rotinas são melhores do que o hector oea héctor são interessantes e linguagens que não tem como ter scanners em uberlândia a premissa para isso é acesso irrestrito às tradings reais em lotes globais que python ruby tem do ponto de vista puramente dos interpretadores ou máquinas virtuais temos php python ruby o javascript que são todos
interpretadores alguns têm acesso a crédito em reais mas na prática todos são essencialmente single fred com lopes globais chamamos dirigiu por conta das antigas tensões e em todos eles a opção de um bi hector com a ajuda de fibras para não complicar a programação é a melhor solução para a concorrência erlang e java são máquinas virtuais no caso de java significa que escala cloud ou mesmo contém todos rodam sobre a mesma máquina virtual essas vm são excepcionais trabalhos de engenharia e foram feitos para seqüestrá todos os recursos da máquina o melhor caso de uso é
seu programa e avm rodarem sozinhas na máquina e ao gerenciar em tudo e mais do que isso o melhor caso é que uma vez iniciadas elas não fiquem reputando toda hora guardem essa informação o episódio de the vox erlang na minha opinião é quem tem as melhores abstrações de concorrência e por conseqüência e mixer também já que ele basicamente gera bytecode pra mesmo a v&m usando os mesmos frame em java escala e depois cujo e cotten adicionaram abstrações de linguagens e biblioteca para facilitar a concorrência inclusive no caso de escala e cloud implementando esquerdo zelândia
e passando a adotar o conceito de green trades que o java nativo não tem o seu charme veio copiando cada uma dessas coisas de outras linguagens como fabrício foi de pulsos e tudo mais mas que eu me lembre não tem esquerdo em uberlândia nem entregues cópias swift fechar tem sim classes chamadas esquerdas que não é a mesma coisa que eu falei de escala algo eles não são serviços do ranking time são classes para agendar coisas para o futuro como o chrome linux onde você diz para determinada tarefa rodar numa tragédia em um determinado horário ou
uma determinada frequência os nomes se confunde e eu sei mas esquerdo de cofre por exemplo é como se fosse um tronco um gol é uma linguagem que compila binário nativo assim como host ou c mas o gol possui um ramtane fez um pedaço grande de código que gruda no seu pra gerar o binário usam final ele tem um escândalo é real cooperativo e oferece green fred com coordenação via china os que como eu disse parece meio como name the pips como eu expliquei no começo do episódio nós de outras linguagens como cristo ainda não têm
o mesmo nível de concorrência paralelismo mesmo em host o suporte à eu assim como demorou para chegar cristo está agora ganha no suporte experimental a rodar fibras em paralelo mas nenhum dos dois possui sketchers em uberlândia que vem pra embutido no ranking da linguagem como go se não ficou claro javascript não tem paralelismo ele é a mais simples de todas as linguagens e muito do investimento em engenharia no google se focou em tornar o v8 muito bancos e código nativo portanto não distingue time com o pai ler um dique muito bom ele não tem sintáxi
complicada não têm bibliotecas padrão para manter obviamente não oferece esquerdo zelândia também ele não tem mágica como python ruby mas também não tem a tradição reais sua única forma de concorrência são generator soul fighters em multitarefa cooperativa e na falta de travis quedas essa multitarefa é controlada num evento em loop e hector no máximo dá pra fazer forte para outros processos porém já o script troca performance por uso de memória então o cope o raith do linux não ajuda muito porque ele faz edith então muita coisa não pode ser reaproveitado entre processos por isso eu
tenho a dizer que apesar de ser rápido é uma das linguagens mais rudimentares que temos eu ia falar sobre a parte da programação mas como já está cumprido pra caramba de novo só resumir eu expliquei até agora sobre como as coisas funcionam por baixo agora como tudo isso fica no seu código se lhe darmos contradiz reais eu já expliquei que precisamos ficar programando muteka fez pra lá e pra cá e linguagens antigas como já você sharp quis com entregues reais você ainda precisa se preocupar com isso em go também você precisa se preocupar com isso
porque transporta ponteiros chanos entregou rotinas ou seja o oposto de um erlang e mixer que não compartilha nada entre seus processos portanto ficou na sua mão como desenvolvedor se virar com sincronização e coordenação experimenta criar um bad lock no seu terreno de gol seu programa com a cheia é um dos motivos porque eu fico meio decepcionado com o em 2019 já que poderia ter oferecido abstrações melhores direto na linguagem mas é uma opinião pessoal o mesmo problema acontece num c ou c pois plans onde eu tenho acesso a tudo incluindo ponteiros esconder ponteiros é uma
decisão de design da linguagem mas assim como gol desapareceu no é considerado ruim hoje em dia o ponteiro também já haviam sido aposentados quando já foi criado não era pra ser nenhuma novidade de qualquer forma no js no começo por 2010 tornou famoso o estilo pouco de programação com o qual becks twist e já com ele tornaram famosa administração de de fernandes e escala não lembro se foi o primeiro mas foi um dos que ajudou a popularizar o thermo fisher não deixa de ser uma pequena evolução sobre defende na prática é mais uma forma de
encapsulá uma execução futura no objeto um tipo de place' holder em vez de fazer sua variável receber direto o resultado de uma chamada assíncrona ou mesmo a chamada externa tipo uma chamada http que não se tem certeza se vai completar ou uma colher e no banco você faz a variável receber um filtro e esse filtro em cápsula essas chamadas incertas quando o filho tinha executar e resolver ele é substituído pelo resultado ninguém mais usa os nomes de furlan ou filtros ou mesmo de lei o próximo passo na evolução promises em particular o famoso speck plus
se você está em java script faz alguns anos já deve estar de saco cheio de ouvir falar de promises dois ou três anos atrás eu dizia que a ironia de promise é que elas permanecerão sendo promessas enfim na prática a promessa é como eu já falei antes de de ford ou filters um objeto que encapsula alguma chamada incertas objeto encadeava e customizável e costuma ter metros o dr qat que é onde você adiciona qual becks como o adi koubek do de flor de twitter de java 8 tem completou fischer frei - como guava tem cérebro
o future javascript tem promise e e plus de flores de leis filtros próteses são termos que acabam sendo usados um lugar do outro mas hoje em dia as pessoas falam mais em promises sobre os objetos de promises podemos adicionar o que chamamos de sintética enxugar ou literalmente o açúcar na sintaxe da linguagem para não ter que lidar com objetos de promise diretamente nem essas configurações via bem ou cats se não me engano a microsoft desenvolveu à sintáxi de assim que ao haiti para os e sharp e várias outras linguagens implementaram algo similar voltando um pouco
e linguagens que tem travis costuma também existe a função de junho por exemplo você pode criar o a rei ou lista com 10 3 ao criar todas elas o código pai que está criando pode chamar john em todas elas assim o programa principal fica bloqueado até todas elas executarem e retornar e daí ele continua a execução com o resultado de todas as tragédias que garantidamente já acabaram de rodar assim que a oit é quase a mesma coisa funções marcadas como assim que costumam devolveu o objeto promisse eo haiti é como se fosse um jovem numa
tragédia o envio de um fire é tipo um jovem uma promessa esperando que ela resolva para depois continuar a diferença é que assim que a oit é uma semântica que pode ser usada entregues green fred socorro rotina soul fighters então é como se fosse john para coisas que não são travis todo o programa que você escreve são trechos de código que chama outros trechos de código uma função chamando outra processos tradicionais gerland e quer nos peixe com táxi teens que é 2000 zeland com rotinas fibras generator são construções do sistema operacional interpretar dois grandes times
ou máquinas virtuais para modelar e executar concorrência e paralelismo recursos das linguagens como filas meio boxes nós próprios e assim que a oit são recursos das linguagens para facilitar a programação de concorrência e para helenismo e finalmente chegamos ao final desse tema eu espero que tenham aprendido o suficiente para começar a entender como as diferentes linguagens lidam com concorrência paralelismo o que de fato acontece por baixo dos panos e não misture o que uma linguagem pode ou não pode fazer na prática hoje em dia todas as linguagens tem recursos muito bons alguns servem para coisas
que os outros não são tão bons então nenhuma das línguas que eu falei aqui é obrigatoriamente melhor do que a outra não adianta ser só rápido não adianta só ter concorrência massiva uma boa linguagem primeiro precisa de um ecossistema que gera resultados com eficiência quanto menos desperdício quanto mais resultados para determinado caso de uso melhor estamos já faz muito tempo nesse assunto de beck em ti e o assunto de concorrência se esticou bastante eu estou em dúvida se semana que vem ainda adicionou mais um tema the black and que é relacionado à gerenciamento de memória
ou seja vou direto com o assunto final da série que é de vox e não vou pensar se ficou com dúvidas não deixe de mandar nos comentários abaixo se curtiu mantém um jóia compartilhe com seus amigos não deixem de assinar o canal e clicar o sininho pra não perder os próximos episódios a gente se vê semana que vem até mais