Modelos de Concurrencia

Preview:

Citation preview

Modelos de concurrencia

Erick Camacho @ecamacho CTO Nubleer

The Free Lunch Is Over. A Fundamental Turn Toward Concurrency in Software

Herb Sutter (Marzo 2005)

"Applications will increasingly need to be concurrent if they want to fully exploit continuing exponential CPU throughput

gains" - Herb Sutter

¿Qué es?

• Paralelismo: Ejecución simultánea de tareas.

• Concurrencia: Cuando dos o más tareas se ejecutan de forma independiente en periodos de tiempo traslapados.

¿Qué es?

• http://concurrencia-go.appspot.com/go_sgce.slide#25

1. Procesos

• Tarea que utiliza el recurso de una computadora.

• Memoria, CPU, red, disco.

• Aislados

• Fork

1. Procesos

• Context - switching

• Multitasking

• Se comunican por RPC

• Costosos: ulimit -u > 709

2. Threads

• Componente de un proceso

• Múltiples threads por proceso

• Memoria compartida

• 2 mb en Linux

2. Threads

• La programación es compleja: semáforos, waits, etc.

• Context switching más rápido que los procesos

• Más ligeros que los procesos

• Técnica común: Pool de threads

2. Threads

“Concurrency Options on the JVM” @jessitron

2. Threads

2. Threads

3. Reactor

• Event-loop

• 1 sólo thread

• Loop de eventos: Reactor va turnando la tarea a ejecutar

• Descrito por Douglas Schmidt en 2000

3. Reactor

3. Reactor

Node.js event loop

3. Reactor

3. Reactor

3. Reactor

• Si una tarea se tarda mucho, afecta a las otras.

• Memoria compartida

• Fácil de entender

4. CSP (GO)

• Presentación

5. Erlang / OTPBasado en el Actores:

1973: Carl Hewitt, Peter Bishop y Richard Steiger

• Procesos ligeros y aislados

• Share-nothing para evitar efectos colaterales (Programación Funcional)

• Comunicación basada en paso de mensajes

• Location transparency

5. Erlang / OTP• Un SO para gestionar procesos ligeros

• ~1.8k de heap inicial

• Una máquina virtual (BEAM)

• Un lenguaje: Erlang

• Un framework para sistemas concurrentes y tolerantes a fallas: OTP

5. Erlang / OTP

• Procesos aislados (seguridad)

• Ligeros (puedes tener millones)

• Tolerante a fallos

• Monitores y alarmas

5. Erlang / OTP

5. Erlang / OTPSupervisores

Workers

OTP App

5. Erlang - Elixir• Creado por José Valim

• 1.0 liberada en septiembre

• Sintaxis más clara y familiar

• Macros!

• Protocolos

• Herramientas para automatizar builds y despliegues

5. Erlang - Elixirparent = self()

# Spawns an Elixir process (not an operating system one!)spawn_link(fn -> send parent, {:msg, "hello world"}end)

# Block until the message is receivedreceive do {:msg, contents} -> IO.puts contentsend

5. Erlang(o Elixir)/OTP

6. Promises / Futures

• Promises: 1976 Daniel P. Friedman y David Wise

• Futures: 1977 Henry Baker y Carl Hewitt

6. Ejemplo: qstep1(function (value1) {

step2(value1, function(value2) {

step3(value2, function(value3) {

step4(value3, function(value4) {

// Do something with value4

});

});

});

});

6. Ejemplo: qQ.fcall(promisedStep1)

.then(promisedStep2)

.then(promisedStep3)

.then(promisedStep4)

.then(function (value4) {

// Do something with value4

})

.catch(function (error) {

// Handle any error from all above steps

})

.done();

6. Promises / Futures

• Implementados en la mayoría de lenguajes: Java, javascript, .NET, Scala, Clojure, Elixir, Ruby, Obj-c, Swift.

• Dependen del modelo de concurrencia de la plataforma.

6. Scala

scala> val something = Future { 10 + 6 } something: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@5535cbe scala> Await.result(something, 0 nanos) res1: Int = 16

6. Elixir

something = Task.async fn -> ...(1)> 10 + 6 ...(1)> end %Task{pid: #PID<0.44.0>, ref: #Reference<0.0.0.55>} iex(2)> Task.await(something) 16

Scala / Elixir• Scala: modelo polling. Se crea un thread y

periodicamente se le pregunta si ya terminó

• Elixir: modelo push. Se crea un proceso independiente que nos notifica cuando termina.

• Fuente: Peter Hamilton http://undiscoveredfeatures.com/elixir-tasks-vs-scala-futures/

Gracias@ecamacho

Recommended