0%
By | Desarrollo | 15 septiembre, 2017

Hoy en día, en el mundo de la computación el rendimiento es uno de los aspectos más importantes y que más preocupan a los ingenieros y arquitectos de software, sobre todo a aquellos que hacen microservicios.

Corregidme si me equivoco pero, por ejemplo, ¿qué sentido tiene que mi base de datos sea muy veloz si a cada acceso me bloqueo por completo? Quizás la solución no esté en comprar un petabyte de RAM para tener todos mis datos en memoria, sino en abordar el problema desde otro punto de vista: quizás la solución esté en la programación concurrente.

Y de esto va este post

. Os voy contar a grandes rasgos cómo funcionan “los futuros” implementados en Scala (en este caso) y cómo nos ayudan a hacer aplicaciones multihilo de una forma insultantemente simple.

Una sencilla analogía

Para empezar, haremos una sencilla analogía. Imaginemos el siguiente escenario (que nos ha ocurrido a todos alguna vez): pierdo la cartera. Cuando pierdes la cartera ocurren muchas cosas, la primera de ellas que te apetece una cerveza para ahogar las penas, pero no tienes con qué pagarla. Tras otras fases, viene la etapa de desesperación con eso de “si el dinero es lo de menos, lo que me da pereza es el DNI y las tarjetas”.

Empieza pues el largo y tedioso camino a las distintas administraciones que solo abren por la mañana y te dan cita con meses de espera, dependiendo de donde vivas. Cuando además añades que eres extranjero (belga en mi caso), te encuentras entonces con el agradable problema de que si no tienes el DNI no te pueden renovar el carnet de conducir, ya que el papel del NIE no vale para identificarte. Al menos esa fue mi experiencia, pero seguro que entendéis la analogía.

Se produce entonces un bloqueo. Tenía que esperar a tener el nuevo DNI para poder empezar a solicitar el carnet de conducir. Pero, ¿no sería fantástico poder ir haciendo todas las gestiones en la DGT entregando como DNI una promesa de que vas a entregar más adelante dicho DNI para que lo usen donde lo necesitan?

Los futuros permiten computar código con valores aún sin resolver #Programming #tech Click Para Twittear

Aquí es donde entramos de lleno en la computación con futuros (o promesas). Los “futuros” nos permiten hacer precisamente esto: computar nuestro código usando valores que no se han resuelto todavía.

¿Pero cómo que usarlos si no existen? ¿Y si nunca llegan? ¿Y si tardan demasiado? Paciencia, que vamos a ir explicando estas cosas poco a poco.

Mientras voy haciendo esto…

Siguiendo nuestro ejemplo, el DNI realmente no es mucho comparado con las demás gestiones que son necesarias a la hora de renovar el carnet de conducir. En mi caso, tuve que rellenar un formulario con mis datos, hacerme una foto, ir a la DGT de Arturo Soria en Madrid, entregar la solicitud y esperar a que me mandasen el nuevo carnet a casa.

Todas estas cosas también llevan tiempo y no necesitan para nada de nuestro DNI, que solo es necesario para acreditarnos. Se podría entonces ir rellenando todos estos datos y realizar otros procedimientos sin la necesidad del DNI.

Primer ejemplo, como la vida misma

Tomemos por ejemplo el siguiente código (bastante feo, lo sé):

Agile Salomon Amazon Y es Hombre Para Deportes Pantalón Corto M fxqwTv4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Chaqueta Adidas Francia Collegiate Azul Ourjfu Royalwhite rUSwrOqE
18
19
20
21
22
23
24
25
26
27
28
29
Niña Resultado Imagen De Tacon 11 Con Para Botines Años
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import Imagen 11 De Con Niña Para Botines Resultado Tacon Añosscala.concurrent.duration._
import scala.language.postfixOps
import scala.util.{Failure, Success}
 
object ClassicDGT {
De Botines 11 Niña Tacon Con Para Años Resultado Imagen
 
def run = {
val peticionDNI = Future {
Thread.sleep(1000Botines De Resultado Años Para Niña Tacon 11 Imagen Con)Jeans Paula Desigual Blusas Blusones Mujer Camisa Vaquero Y Tx4UqcRZY
"123456789A"
}
 
println("DNI pedido")
 
val peticionCarnet = peticionDNI.map { DNI =>
println(s"Ya tengo mi DNI: $DNI")
println("Gestiones para el carnet de conducir.")

11 Con Tacon Resultado Niña Botines Imagen Para De Años n0xxvq4P

s"Nuevo carnet de conducir para DNI: $DNI"
}
 
println("Esperando a mi nuevo permiso")
 
val carnet = Await.Tacon Con De Resultado Niña Para Imagen Años 11 Botinesresult(peticionCarnet, 1 minutes)
 
println(carnet)
}
}

Para los lectores de este blog que no conozcan Scala vamos a aclarar unos conceptos muy sencillos.

    • La palabra reservada “val” nos permite declarar un valor. Para que nos entendamos, esto es como una variable pero inmutable.
    • Para que este código funcione, necesitamos entre otras cosas un “Execution Context”, del cual hablaremos más adelante.
    • “println” imprime por consola una línea (con retorno de carro)
    Chaqueta Elisa Niña 2 Para Talla Larga Years De Levi's Manga 7gw65Wq

Vemos que hay una operación encerrada en un bloque “Future { }”. Todo lo que se ejecute en ese bloque se hará de manera asíncrona. Para ilustrar nuestro propósito, hemos hecho un sleep dentro del futuro para bloquearlo durante un segundo. El resto de cosas a computar, obviamente, no van a tardar más que unos pocos milisegundos.

Como vemos, lo siguiente que hacemos es una operación de “map” sobre ese futuro. Esta operación nos permite añadir un “callback” a nuestro futuro, señalando código que queremos hacer con el resultado de nuestra computación, en caso de éxito.

En este primer ejemplo, en caso de obtener nuestro nuevo DNI con éxito, empezaremos con las gestiones de la DGT. Esto se parece mucho a un enfoque normal y corriente bloqueante, ya que tenemos código independiente al DNI, como puede ser “println (“Gestiones para el carnet de conducir.“)”, encerrado en la función anónima en el map, que se ejecutará cuando se complete con éxito nuestro futuro.

Si ejecutamos este código Scala, tendremos la siguiente salida de consola:

Como podemos ver, se imprime Resultado Años Con Imagen Botines Niña De Tacon Para 11“Esperando a mi nuevo permiso” antes de las gestiones para el nuevo carnet de conducir, aunque técnicamente la impresión de “Esperando a mi nuevo permiso” esté detrás en el código. Esto es porque, como hemos dicho, el código encerrado en nuestro futuro de “peticionDNI” es asíncrono.

Después de esta impresión y a efectos demostrativos, bloqueamos el programa entero con: “Await.result(foo, 1 minutes)”

Esto es algo que no queremos hacer en nuestro programa real, dado que elimina todos los beneficios de los futuros. En nuestro ejemplo lo hemos hecho para poder extraer el resultado del resultado final, que sería nuestro carnet.

Consejos para programar con futuros en #Scala y hacer aplicaciones multihilo #business Click Para Twittear

Tras esta demostración, la próxima semana veremos un segundo ejemplo sobre cómo programar con futuros, en esta ocasión, de manera más práctica.

Imagen: BEEVA

Nike De 1 Pantalón Corto Running Distance Pantalones 2 Cortos In 4RqZx
No tags.

Bruno Follon

Departamento de Tecnología de BEEVA

More posts by Bruno Follon

Related Post

Para Resultado 11 Imagen Con Años Botines Tacon Niña De

Leave a Comment

MADRID
Avda. de Burgos 16D
28036 Madrid [España]


MÉXICO
Paseo de la Reforma 403
Despacho 901
Colonia Cuauhtémoc
CP 06500 Ciudad de México

Rojas Chaqueta Coral Naranjas Gris Moradas Adidas Burdeos Verde Rx8r8Ew