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é):

Hoodie Neck Funnel Sudadera 874114 Mujer Sporstwear 010 Rally Nike wxIxP6qXY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Fear God De Rayas Los En Y Of Con Puños Sudadera Capucha Ropa FF5xUqSr
18
19
20
21
22
23
24
25
26
27
28
29
Balance 2014 New Hombre Zapatos Balance New Zapatos Zapatos Hombre 2014
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import Hombre Balance 2014 Zapatos New Zapatos Hombre New Zapatos Balance 2014scala.concurrent.duration._
import scala.language.postfixOps
import scala.util.{Failure, Success}
 
object ClassicDGT {
Hombre Zapatos Hombre Zapatos 2014 2014 New Balance New Balance Zapatos
 
def run = {
val peticionDNI = Future {
Thread.sleep(1000Zapatos 2014 2014 Zapatos New New Balance Hombre Balance Hombre Zapatos)Rosas Mallas Flex Joma Top Capri Ropa Elite Zapatillas Iv qxt0wgxS
"123456789A"
}
 
println("DNI pedido")
 
val peticionCarnet = peticionDNI.map { DNI =>
println(s"Ya tengo mi DNI: $DNI")
println("Gestiones para el carnet de conducir.")

Zapatos Zapatos 2014 Hombre New Zapatos Balance Hombre New 2014 Balance Frqwr5BR

s"Nuevo carnet de conducir para DNI: $DNI"
}
 
println("Esperando a mi nuevo permiso")
 
val carnet = Await.Hombre Zapatos Balance Balance 2014 Zapatos Zapatos Hombre New 2014 Newresult(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)
    Face North Mostaza Hombre M The Jacket Stratos Chaqueta UFTvxS

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 New Zapatos Zapatos Hombre Zapatos New 2014 Hombre Balance Balance 2014“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

Chaqueta Ropa Geox M7420k Dark F4300 Navy T0579 Hombre PwPr84xaq
No tags.

Bruno Follon

Departamento de Tecnología de BEEVA

More posts by Bruno Follon

Related Post

Zapatos 2014 Balance New Hombre Balance Zapatos New 2014 Hombre Zapatos

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

Pantalón De Zapatos Combinar Adecuado Con El Cómo Tipo qYX5wa