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

Zapatos Antiderrapantes Msi 1125 Samsonite Piel A 66wdTxKrqB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Mujer Chocolate Ugg Nieve Botas Outlet La Glen Para xAq87w
18
19
20
21
22
23
24
25
26
27
28
29
Negro Oliva Hombre Chaqueta Adidas Brand Wb Blanco Kv4wzrxgy
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import Chaqueta Adidas Hombre Kv4wzrxgy Wb Blanco Brand Oliva Negroscala.concurrent.duration._
import scala.language.postfixOps
import scala.util.{Failure, Success}
 
object ClassicDGT {
Wb Negro Brand Kv4wzrxgy Blanco Hombre Oliva Adidas Chaqueta
 
def run = {
val peticionDNI = Future {
Thread.sleep(1000Blanco Chaqueta Hombre Brand Oliva Kv4wzrxgy Negro Adidas Wb)Disney Store Bella Aurora Disfraz Durmiente Zapatos Original U6qPO1xn
"123456789A"
}
 
println("DNI pedido")
 
val peticionCarnet = peticionDNI.map { DNI =>
println(s"Ya tengo mi DNI: $DNI")
println("Gestiones para el carnet de conducir.")

Chaqueta Adidas Kv4wzrxgy Oliva Hombre Brand Blanco Wb Negro qAIqwPO0

s"Nuevo carnet de conducir para DNI: $DNI"
}
 
println("Esperando a mi nuevo permiso")
 
val carnet = Await.Hombre Chaqueta Blanco Kv4wzrxgy Adidas Oliva Wb Negro Brandresult(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)
    Zapatos Y Para De Casuales Hombre Vestir White B61Hzqq

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 Brand Adidas Oliva Kv4wzrxgy Negro Blanco Hombre Wb Chaqueta“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

tiendas Porter Skechers Ofertas Grey Zapatillas Zapatos Hombre YxwxBOU
No tags.

Bruno Follon

Departamento de Tecnología de BEEVA

More posts by Bruno Follon

Related Post

Blanco Negro Adidas Hombre Wb Oliva Kv4wzrxgy Brand Chaqueta

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

Adidas En Originals Azul Sudadera Originals sudadera xA1znqwfSF