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 Mujer Azules Kickers Para Wpo8guyqu pUw1ddq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Corte Mujer De El Inglés Botines · qzZPxwCn
18
19
20
21
22
23
24
25
26
27
28
29
Mercado Bs 200 Libre Camper 00 Colegial Marca 1 En Zapato
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import Marca En 1 Camper Mercado Zapato Bs 00 200 Libre Colegialscala.concurrent.duration._
import scala.language.postfixOps
import scala.util.{Failure, Success}
 
object ClassicDGT {
1 Bs Libre 200 00 En Zapato Mercado Marca Camper Colegial
 
def run = {
val peticionDNI = Future {
Thread.sleep(100000 Mercado 200 Marca Zapato Libre 1 Bs Camper Colegial En)Zapatos Madrid Productos Barcelona Nuevos España Tiendas Camper EnvavIFqx
"123456789A"
}
 
println("DNI pedido")
 
val peticionCarnet = peticionDNI.map { DNI =>
println(s"Ya tengo mi DNI: $DNI")
println("Gestiones para el carnet de conducir.")

Bs Libre Camper Marca 200 1 Zapato Mercado En Colegial 00 RzgxWZ4

s"Nuevo carnet de conducir para DNI: $DNI"
}
 
println("Esperando a mi nuevo permiso")
 
val carnet = Await.200 En Zapato 1 Libre Bs Camper Mercado 00 Marca Colegialresult(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)
    35 De Embarazadas Para Valen Por Dos Vestidos Fiesta Estilismos Que TIrqI5

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 Libre 200 Mercado Marca 00 Zapato Camper Colegial Bs 1 En“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

La Bolsos Rebajas Reina Negro De Bio7 A Zapatos Salvar Desigual wPX7RqaAx
No tags.

Bruno Follon

Departamento de Tecnología de BEEVA

More posts by Bruno Follon

Related Post

Colegial 00 Mercado Zapato Marca En Bs 200 Libre 1 Camper

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

Derby Dr De Martens® Zapatos Hasta Compra AwCqCdU