SlideShare uma empresa Scribd logo
enfrentando os demônios da
programação moderna
Episódio I
O Diabo da Concorrência
| “In a concurrent world, imperative is the wrong default.”
Tim Sweeney, CEO da Epic Games
O que é concorrência?
O que é concorrência?
O que é concorrência?
Concorrência x Paralelismo
Concorrência x Paralelismo
*meramente ilustrativo, não é bem assim
Process e Thread
Race Condition
● Dependência de várias tasks de um dado em comum
● Não-determinístico
Race Condition 🏃🏾♀️
Race Condition 🏃🏾♀️
CRuby: Global Virtual Machine Lock (GVL)
Evitando Race Condition ✋🏾🏃🏾♀️
Evitando Race Condition ✋🏾🏃🏾♀️
Node.JS: Event Loop
Como evitar esses problemas?
● Boas práticas (encapsular o estado, etc)?
● Evitar concorrência?
● Trabalhar com forks de aplicação
● …?
Ruby
Javascript
E se a gente só não
compartilhasse estado?
E se a gente só não
compartilhasse estado?
Tipo, de verdade? 🤯
Episódio II
De Volta para o Futuro
| “Reject modernity; embrace tradition.”
Algum conservador no twitter
Erlang
● Quase 40 anos de existência
● Pensada para resolver problemas de alta disponibilidade em telecom:
○ Distribuição
○ Tolerância a Falhas
BEAM
● Máquina virtual do Erlang
● Modelo de runtime desenhado para resolver os problemas citados
Actor Model
(bem, mais ou menos…)
Processos: Erlang Actors
● Unidades vivas e encapsuladas (como Processos do SO)
● Tudo é um Processo
● Se comunicam por meio de mensagens
● Não compartilham memória (!!!!)
● São muito leves (rodando em uma máquina comum pode chegar a milhões de processos)!
● Caso não consigam fazer o que precisam, eles morrem 💣
Actors
Mensagens de processos e Mailboxes ✉
● Mensagens podem ser qualquer coisa (um inteiro, um `map` ou até uma função)
● São não-bloqueantes
● Sabendo o id do processo (ou o nome dele), é possível enviar mensagens para qualquer um
● O processo destinatário nem precisa estar na mesma máquina que o remetente (!)
Coding Time! 💻
Se um processo der erro?
Podemos supervisionar processos!
Coding Time! 💻
Então, se processos são...
● Atômicos
● Se comunicam por mensagens
● Não compartilham estado
Então, se processos são...
● Atômicos
● Se comunicam por mensagens
● Não compartilham estado
Quer dizer que podemos fazer um
código concorrente de verdade? 🤔
SIM!
Não só concorrente,
mas paralelo também!
Um processo pode ocupar uma
thread indefinidamente?
Não. Isso é chamado de preemptive
scheduling
“o que linguagens fazem por segurança
de memória (como GC), Elixir também
faz por segurança de concorrência”
.
— Nathan Long em Elixir is Safe
Na prática,
quando vou usar isso?
Na prática,
quando vou usar isso?
Bem, não todo dia…
Na prática,
quando vou usar isso?
Bem, não todo dia…
Mas…
Em Elixir/Erlang, tudo é processo
Teste de websockets. Conexões simultâneas
Inclusive conexões com o servidor, por exemplo :)
E o ?
Concorrência em Go: CSP, Channels e Goroutines
Sender(s) Receiver(s)
Características
● Implementação em semáforos
● Arquitetura de threads parecida com a do Erlang
● Co-operative scheduling
● Goroutines são opcionais da linguagem
● Simples de implementar: `go func()`
Possíveis problemas
● Co-operative scheduling == block?
● Estado compartilhado ainda é possível
● Não há comunicação entre nodes
● Comunicação em channels não é 100% async
● Goroutines não se conhecem
Go e erlang possuem focos diferentes
● Golang:
○ Rápido deploy e execução
○ Fácil adoção
● Erlang/Elixir:
○ Tolerância a falhas
○ Distribuição
Em Go, concorrência é um detalhe de design;
em Erlang, é o ponto central da arquitetura
.
Finalizando...
Erlang e Beam: concorrência + resiliência by design
● Processos isolados e Actor Model*
● Preemptive Scheduling
● Árvore de Supervisão
● OTP
● Funcional
Pera, funcional?! 😥
Continua...
os alquimistas estão chegando 🤔
Referências
- Exploring Ruby’s Multi-threaded Weirdness (21/03/2021)
- Introdução ao Node.js (Single-Thread, Event-Loop e mercado) (19/03/2021)
- Frequently Asked Questions about Erlang (21/03/2021)
- JURIC, Sasa. Elixir in Action, 2019
- Erlang Scheduler Details and Why It Matters (21/03/2021)
- Who Supervises The Supervisors? (22/03/2021)
- Elixir is Safe (07/04/2021)
- Websocket Shootout: Clojure, C++, Elixir, Go, NodeJS, and Ruby (22/03/2021)
- COSTA, Gabriel et al. Escalabilidade de sistemas web em diferentes arquiteturas. TCC. 2020. (22/03/2021)
- Effective Go - The Go Programming Language (04/04/2021)
- Go vs Elixir: A concurrency comparison (03/04/2021)

Mais conteúdo relacionado

Mais procurados

게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
Flow-based programming with Elixir
Flow-based programming with ElixirFlow-based programming with Elixir
Flow-based programming with Elixir
Anton Mishchuk
 
CNIT 126 5: IDA Pro
CNIT 126 5: IDA ProCNIT 126 5: IDA Pro
CNIT 126 5: IDA Pro
Sam Bowne
 
Gestão de Decisões e Regras de Negócio
Gestão de Decisões e Regras de NegócioGestão de Decisões e Regras de Negócio
Gestão de Decisões e Regras de Negócio
Mauricio Bitencourt
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
Seungmo Koo
 
Chord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
Chord- A Scalable Peer-to-Peer Lookup Service for Internet ApplicationsChord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
Chord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
Chandan Thakur
 
Lógica de Programação - Algoritmos
Lógica de Programação - AlgoritmosLógica de Programação - Algoritmos
Lógica de Programação - Algoritmos
Roney Sousa
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현noerror
 
llvm basic porting for risc v
llvm basic porting for risc vllvm basic porting for risc v
llvm basic porting for risc v
Tsung-Chun Lin
 
C Programming - Refresher - Part I
C Programming - Refresher - Part I C Programming - Refresher - Part I
C Programming - Refresher - Part I
Emertxe Information Technologies Pvt Ltd
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
Karen Costa
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
Lock free queue
Lock free queueLock free queue
Lock free queue
Bongseok Cho
 
Flip Flops Parte 4
Flip Flops Parte 4Flip Flops Parte 4
Flip Flops Parte 4
Elaine Cecília Gatto
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
DongMin Choi
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
Kyoungseok Yang
 

Mais procurados (20)

게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
Flow-based programming with Elixir
Flow-based programming with ElixirFlow-based programming with Elixir
Flow-based programming with Elixir
 
CNIT 126 5: IDA Pro
CNIT 126 5: IDA ProCNIT 126 5: IDA Pro
CNIT 126 5: IDA Pro
 
Gestão de Decisões e Regras de Negócio
Gestão de Decisões e Regras de NegócioGestão de Decisões e Regras de Negócio
Gestão de Decisões e Regras de Negócio
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
Chord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
Chord- A Scalable Peer-to-Peer Lookup Service for Internet ApplicationsChord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
Chord- A Scalable Peer-to-Peer Lookup Service for Internet Applications
 
Lógica de Programação - Algoritmos
Lógica de Programação - AlgoritmosLógica de Programação - Algoritmos
Lógica de Programação - Algoritmos
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현
 
llvm basic porting for risc v
llvm basic porting for risc vllvm basic porting for risc v
llvm basic porting for risc v
 
C Programming - Refresher - Part I
C Programming - Refresher - Part I C Programming - Refresher - Part I
C Programming - Refresher - Part I
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
Flip Flops Parte 4
Flip Flops Parte 4Flip Flops Parte 4
Flip Flops Parte 4
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
 

Semelhante a Concorrência e Paralelismo em Elixir (e outras linguagens)

Princípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémPrincípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e Além
Locaweb
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
AndreCosta502039
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando Python
Flávio Ribeiro
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e Erlang
Elaine Naomi
 
Domando a irreversibilidade com feature flags
Domando a irreversibilidade com feature flagsDomando a irreversibilidade com feature flags
Domando a irreversibilidade com feature flags
Hugo Bessa
 
A linguagem de programação Erlang
A linguagem de programação ErlangA linguagem de programação Erlang
A linguagem de programação Erlang
elliando dias
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhor
Leandro Ferreira
 
Design patterns
Design patternsDesign patterns
Design patterns
Vinícius Krolow
 
Palestra: Introdução à TypeScript & Features Ts 2.x
Palestra: Introdução à TypeScript & Features Ts 2.x Palestra: Introdução à TypeScript & Features Ts 2.x
Palestra: Introdução à TypeScript & Features Ts 2.x
Glaucia Lemos
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usando
Hudson Brendon
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
Evaldo Junior
 
Apresentação Introdução Typescript - .Net Caxias do Sul
Apresentação   Introdução Typescript - .Net Caxias do SulApresentação   Introdução Typescript - .Net Caxias do Sul
Apresentação Introdução Typescript - .Net Caxias do Sul
Glaucia Lemos
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
Alexandre Machado
 
12 threads
12 threads12 threads
12 threads
Thiago Oliveira
 
Aspectos profissionais 3pontos
Aspectos profissionais 3pontosAspectos profissionais 3pontos
Aspectos profissionais 3pontos
Miguel Alho
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Dickson S. Guedes
 
Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividade
Cleórbete Santos
 
Coders on beer javascript de ponta a ponta
Coders on beer   javascript de ponta a pontaCoders on beer   javascript de ponta a ponta
Coders on beer javascript de ponta a ponta
Kirmayr tomaz
 
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
Hugo Baraúna
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheiras
Higor César
 

Semelhante a Concorrência e Paralelismo em Elixir (e outras linguagens) (20)

Princípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémPrincípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e Além
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando Python
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e Erlang
 
Domando a irreversibilidade com feature flags
Domando a irreversibilidade com feature flagsDomando a irreversibilidade com feature flags
Domando a irreversibilidade com feature flags
 
A linguagem de programação Erlang
A linguagem de programação ErlangA linguagem de programação Erlang
A linguagem de programação Erlang
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhor
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Palestra: Introdução à TypeScript & Features Ts 2.x
Palestra: Introdução à TypeScript & Features Ts 2.x Palestra: Introdução à TypeScript & Features Ts 2.x
Palestra: Introdução à TypeScript & Features Ts 2.x
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usando
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
Apresentação Introdução Typescript - .Net Caxias do Sul
Apresentação   Introdução Typescript - .Net Caxias do SulApresentação   Introdução Typescript - .Net Caxias do Sul
Apresentação Introdução Typescript - .Net Caxias do Sul
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
12 threads
12 threads12 threads
12 threads
 
Aspectos profissionais 3pontos
Aspectos profissionais 3pontosAspectos profissionais 3pontos
Aspectos profissionais 3pontos
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividade
 
Coders on beer javascript de ponta a ponta
Coders on beer   javascript de ponta a pontaCoders on beer   javascript de ponta a ponta
Coders on beer javascript de ponta a ponta
 
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma ...
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheiras
 

Último

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
2m Assessoria
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Gabriel de Mattos Faustino
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 

Último (10)

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 

Concorrência e Paralelismo em Elixir (e outras linguagens)

  • 1. enfrentando os demônios da programação moderna
  • 2. Episódio I O Diabo da Concorrência | “In a concurrent world, imperative is the wrong default.” Tim Sweeney, CEO da Epic Games
  • 3. O que é concorrência?
  • 4. O que é concorrência?
  • 5. O que é concorrência?
  • 8. *meramente ilustrativo, não é bem assim Process e Thread
  • 10. ● Dependência de várias tasks de um dado em comum ● Não-determinístico Race Condition 🏃🏾♀️
  • 12. CRuby: Global Virtual Machine Lock (GVL) Evitando Race Condition ✋🏾🏃🏾♀️
  • 13. Evitando Race Condition ✋🏾🏃🏾♀️ Node.JS: Event Loop
  • 14. Como evitar esses problemas? ● Boas práticas (encapsular o estado, etc)? ● Evitar concorrência? ● Trabalhar com forks de aplicação ● …?
  • 16. E se a gente só não compartilhasse estado?
  • 17. E se a gente só não compartilhasse estado? Tipo, de verdade? 🤯
  • 18. Episódio II De Volta para o Futuro | “Reject modernity; embrace tradition.” Algum conservador no twitter
  • 19. Erlang ● Quase 40 anos de existência ● Pensada para resolver problemas de alta disponibilidade em telecom: ○ Distribuição ○ Tolerância a Falhas BEAM ● Máquina virtual do Erlang ● Modelo de runtime desenhado para resolver os problemas citados
  • 20. Actor Model (bem, mais ou menos…)
  • 21. Processos: Erlang Actors ● Unidades vivas e encapsuladas (como Processos do SO) ● Tudo é um Processo ● Se comunicam por meio de mensagens ● Não compartilham memória (!!!!) ● São muito leves (rodando em uma máquina comum pode chegar a milhões de processos)! ● Caso não consigam fazer o que precisam, eles morrem 💣
  • 23. Mensagens de processos e Mailboxes ✉ ● Mensagens podem ser qualquer coisa (um inteiro, um `map` ou até uma função) ● São não-bloqueantes ● Sabendo o id do processo (ou o nome dele), é possível enviar mensagens para qualquer um ● O processo destinatário nem precisa estar na mesma máquina que o remetente (!)
  • 25. Se um processo der erro? Podemos supervisionar processos!
  • 27. Então, se processos são... ● Atômicos ● Se comunicam por mensagens ● Não compartilham estado
  • 28. Então, se processos são... ● Atômicos ● Se comunicam por mensagens ● Não compartilham estado Quer dizer que podemos fazer um código concorrente de verdade? 🤔
  • 29. SIM! Não só concorrente, mas paralelo também!
  • 30.
  • 31. Um processo pode ocupar uma thread indefinidamente? Não. Isso é chamado de preemptive scheduling
  • 32. “o que linguagens fazem por segurança de memória (como GC), Elixir também faz por segurança de concorrência” . — Nathan Long em Elixir is Safe
  • 34. Na prática, quando vou usar isso? Bem, não todo dia…
  • 35. Na prática, quando vou usar isso? Bem, não todo dia… Mas…
  • 36. Em Elixir/Erlang, tudo é processo Teste de websockets. Conexões simultâneas Inclusive conexões com o servidor, por exemplo :)
  • 37. E o ?
  • 38. Concorrência em Go: CSP, Channels e Goroutines Sender(s) Receiver(s)
  • 39. Características ● Implementação em semáforos ● Arquitetura de threads parecida com a do Erlang ● Co-operative scheduling ● Goroutines são opcionais da linguagem ● Simples de implementar: `go func()`
  • 40. Possíveis problemas ● Co-operative scheduling == block? ● Estado compartilhado ainda é possível ● Não há comunicação entre nodes ● Comunicação em channels não é 100% async ● Goroutines não se conhecem
  • 41. Go e erlang possuem focos diferentes ● Golang: ○ Rápido deploy e execução ○ Fácil adoção ● Erlang/Elixir: ○ Tolerância a falhas ○ Distribuição Em Go, concorrência é um detalhe de design; em Erlang, é o ponto central da arquitetura .
  • 43. Erlang e Beam: concorrência + resiliência by design ● Processos isolados e Actor Model* ● Preemptive Scheduling ● Árvore de Supervisão ● OTP ● Funcional
  • 46. Referências - Exploring Ruby’s Multi-threaded Weirdness (21/03/2021) - Introdução ao Node.js (Single-Thread, Event-Loop e mercado) (19/03/2021) - Frequently Asked Questions about Erlang (21/03/2021) - JURIC, Sasa. Elixir in Action, 2019 - Erlang Scheduler Details and Why It Matters (21/03/2021) - Who Supervises The Supervisors? (22/03/2021) - Elixir is Safe (07/04/2021) - Websocket Shootout: Clojure, C++, Elixir, Go, NodeJS, and Ruby (22/03/2021) - COSTA, Gabriel et al. Escalabilidade de sistemas web em diferentes arquiteturas. TCC. 2020. (22/03/2021) - Effective Go - The Go Programming Language (04/04/2021) - Go vs Elixir: A concurrency comparison (03/04/2021)

Notas do Editor

  1. boas práticas: - É ótimo, mas um dev desavisado pode acabar fazendo 💩 evitar concorrência: Sacrifica performance forks: copia o estado da aplicação e roda paralelamente. custa muita memória e não abre espaço pra microcomunicação
  2. .