You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: es/overviews/core/actors.md
+33-36Lines changed: 33 additions & 36 deletions
Original file line number
Diff line number
Diff line change
@@ -25,7 +25,7 @@ El comportamiento de un `Reactor` se define mediante la implementación de su m
25
25
26
26
El trait `Reactor` tiene un parámetro de tipo `Msg` el cual determina el tipo de mensajes que un actor es capaz de recibir.
27
27
28
-
La invocación del método `!` de un `Reactor` envía un mensaje al receptor. La operación de envío de un mensaje mediante el operador `!` es asíncrona por lo que el actor que envía el mensaje no se bloquea esperando a que el mensaje sea recibido sino que su ejecución continua de manera inmediata. Por ejemplo, `a ! msg` envia `msg` a `a`. Todos los actores disponen de un *buzón* encargado de regular los mensajes entrantes hasta que son procesados.
28
+
La invocación del método `!` de un `Reactor` envía un mensaje al receptor. La operación de envío de un mensaje mediante el operador `!` es asíncrona por lo que el actor que envía el mensaje no se bloquea esperando a que el mensaje sea recibido sino que su ejecución continua de manera inmediata. Por ejemplo, `a ! msg` envia `msg` a `a`. Todos los actores disponen de un *buzón* encargado de regular los mensajes entrantes hasta que son procesados.
29
29
30
30
El trait `Reactor` trait también define el método `forward`. Este método es heredado de `OutputChannel` y tiene el mismo efecto que el método `!`. Aquellos traits que hereden de `Reactor`, en particular el trait `ReplyActor`, sobreescriben este método para habilitar lo que comunmente se conocen como *"implicit reply destinations"* (ver a continuación)
31
31
@@ -63,7 +63,7 @@ El miembro `exceptionHandler` permite llevar a cabo la definición de un manejad
63
63
Este manejador de excepciones (`exceptionHandler`) retorna una función parcial que se utiliza para gestionar excepciones que no hayan sido tratadas de ninguna otra manera. Siempre que una excepción se propague fuera del método `act` de un `Reactor` el manejador anterior será aplicado a dicha excepción, permitiendo al actor ejecutar código de limpieza antes de que se termine. Nótese que la visibilidad de `exceptionHandler` es `protected`.
64
64
65
65
El manejo de excepciones mediante el uso de `exceptionHandler` encaja a la perfección con las estructuras de control utilizadas para programas con el método `react`. Siempre que una excepción es manejada por la función parcial retornada por `excepctionHandler`, la ejecución continua con la "closure" actual:
66
-
66
+
67
67
loop {
68
68
react {
69
69
case Msg(data) =>
@@ -78,14 +78,14 @@ Assumiendo que `Reactor` sobreescribe el atributo `exceptionHandler`, tras el la
78
78
79
79
El trait `ReplyReactor` extiende `Reactor[Any]` y sobrescribe y/o añade los siguientes métodos:
80
80
81
-
- El método `!` es sobrescrito para obtener una referencia al actor
82
-
actual (el emisor). Junto al mensaje actual, la referencia a dicho
83
-
emisor es enviada al buzón del actor receptor. Este último dispone de
81
+
- El método `!` es sobrescrito para obtener una referencia al actor
82
+
actual (el emisor). Junto al mensaje actual, la referencia a dicho
83
+
emisor es enviada al buzón del actor receptor. Este último dispone de
84
84
acceso al emisor del mensaje mediante el uso del método `sender` (véase más abajo).
85
85
86
86
- El método `forward` es sobrescrito para obtener una referencia al emisor
87
87
del mensaje que actualmente está siendo procesado. Junto con el mensaje
88
-
actual, esta referencia es enviada como el emisor del mensaje actual.
88
+
actual, esta referencia es enviada como el emisor del mensaje actual.
89
89
Como consuencia de este hecho, `forward` nos permite reenviar mensajes
90
90
en nombre de actores diferentes al actual.
91
91
@@ -112,15 +112,15 @@ El trait `ReplyReactor` extiende `Reactor[Any]` y sobrescribe y/o añade los sig
112
112
`Future`. Esta última puede ser utilizada para recuperar la respuesta del receptor una
113
113
vez se encuentre disponible; asimismo puede ser utilizada para comprobar si la respuesta
114
114
está disponible sin la necesidad de bloquear el emisor. Existen dos versiones sobrecargadas.
115
-
La versión que acepta dos parámetros recibe un argumento adicional de tipo
115
+
La versión que acepta dos parámetros recibe un argumento adicional de tipo
116
116
`PartialFuntion[Any, A]`. Esta función parcial es utilizada para realizar el post-procesado de
117
117
la respuesta del receptor. Básicamente, `!!` retorna un "future" que aplicará la anterior
118
118
función parcial a la repuesta (una vez recibida). El resultado del "future" es el resultado
119
119
de este post-procesado.
120
120
121
121
- El método (añadido) `reactWithin` permite llevar a cabo la recepción de mensajes en un periodo
122
122
determinado de tiempo. En comparación con el método `react`, recibe un parámetro adicional,
123
-
`msec`, el cual representa el periodo de tiempo, expresado en milisegundos, hasta que el patrón `TIMEOUT`
123
+
`msec`, el cual representa el periodo de tiempo, expresado en milisegundos, hasta que el patrón `TIMEOUT`
124
124
es satisfecho (`TIMEOUT` es un "case object" presente en el paquete `scala.actors`). Ejemplo:
125
125
126
126
reactWithin(2000) {
@@ -155,14 +155,11 @@ El trait `Actor` extiende de `ReplyReactor` añadiendo y/o sobrescribiendo los s
155
155
156
156
- El método (añadido) `receive` se comporta del mismo modo que `react`, con la excepción
157
157
de que puede retornar un resultado. Este hecho se ve reflejado en la definición del tipo,
158
-
que es polimórfico en el tipo del resultado:
159
-
160
-
def receive[R](f: PartialFunction[Any, R]): R
161
-
158
+
que es polimórfico en el tipo del resultado: `def receive[R](f: PartialFunction[Any, R]): R`.
162
159
Sin embargo, la utilización de `receive` hace que el uso del actor
163
160
sea más pesado, puesto que el hilo subyacente es bloqueado mientras
164
161
el actor está esperando por la respuesta. El hilo bloqueado no está
165
-
disponible para ejecutar otros actores hasta que la invocación del
162
+
disponible para ejecutar otros actores hasta que la invocación del
166
163
método `receive` haya retornado.
167
164
168
165
- El método (añadido) `link` permite a un actor enlazarse y desenlazarse de otro
@@ -181,7 +178,7 @@ El trait `Actor` extiende de `ReplyReactor` añadiendo y/o sobrescribiendo los s
181
178
182
179
#### Terminación y estados de ejecución
183
180
184
-
Cuando la ejecución de un actor finaliza, el motivo de dicha terminación puede ser
181
+
Cuando la ejecución de un actor finaliza, el motivo de dicha terminación puede ser
185
182
establecida de manera explícita mediante la invocación de la siguiente variante
186
183
del método `exit`:
187
184
@@ -202,11 +199,11 @@ mensaje mediante la utilización del método `receiveWithin` se encuentra en el
202
199
203
200
El trait `Reactor` define una serie de estructuras de control que simplifican el mecanismo
204
201
de programación con la función sin retorno `react`. Normalmente, una invocación al método
205
-
`react` no retorna nunca. Si el actor necesita ejecutar código a continuación de la invocación
202
+
`react` no retorna nunca. Si el actor necesita ejecutar código a continuación de la invocación
206
203
anterior, tendrá que pasar, de manera explícita, dicho código al método `react` o utilizar
207
204
algunas de las estructuras que encapsulan este comportamiento.
208
205
209
-
La estructura de control más basica es `andThen`. Permite registrar una `closure` que será
206
+
La estructura de control más basica es `andThen`. Permite registrar una `closure` que será
210
207
ejecutada una vez el actor haya terminado la ejecución de todo lo demas.
211
208
212
209
actor {
@@ -224,10 +221,10 @@ del mensaje `hello`. Aunque la invocación del método `react` no retorna,
224
221
podemos utilizar `andThen` para registrar el código encargado de imprimir
225
222
el saludo a continuación de la ejecución del actor.
226
223
227
-
Nótese que existe una *atribución de tipo* a continuación de la invocación
224
+
Nótese que existe una *atribución de tipo* a continuación de la invocación
228
225
de `react` (`:Unit`). Básicamente, nos permite tratar el resultado de
229
226
`react` como si fuese de tipo `Unit`, lo cual es legal, puesto que el resultado
230
-
de una expresión siempre se puede eliminar. Es necesario llevar a cabo esta operación
227
+
de una expresión siempre se puede eliminar. Es necesario llevar a cabo esta operación
231
228
dado que `andThen` no puede ser un miembro del tipo `Unit`, que es el tipo del resultado
232
229
retornado por `react`. Tratando el tipo de resultado retornado por `react` como
233
230
`Unit` permite llevar a cabo la aplicación de una conversión implícita la cual
@@ -245,7 +242,7 @@ la ejecución continua con la siguiente iteración del bucle actual.
245
242
condición `c` tome el valor `true`. La invocación de `react` en el cuerpo
246
243
del bucle ocasiona el mismo efecto que en el caso de `loop`.
247
244
248
-
-`continue`. Continua con la ejecución de la closure actual. La invocación
245
+
-`continue`. Continua con la ejecución de la closure actual. La invocación
249
246
de `continue` en el cuerpo de un `loop`o `loopWhile` ocasionará que el actor
250
247
termine la iteración en curso y continue con la siguiente. Si la iteración en
251
248
curso ha sido registrada utilizando `andThen`, la ejecución continua con la
@@ -254,7 +251,7 @@ segunda "closure" pasada como segundo argumento a `andThen`.
254
251
Las estructuras de control pueden ser utilizadas en cualquier parte del cuerpo
255
252
del método `act` y en los cuerpos de los métodos que, transitivamente, son
256
253
llamados por `act`. Aquellos actores creados utilizando la sintáxis `actor { ... }`
257
-
pueden importar las estructuras de control desde el objeto `Actor`.
254
+
pueden importar las estructuras de control desde el objeto `Actor`.
258
255
259
256
#### Futures
260
257
@@ -268,7 +265,7 @@ future *aplicando* dicha future. Por ejemplo, el envío de un mensaje mediante
268
265
`val fut = a !! msg` permite al emisor esperar por el resultado del future
269
266
del siguiente modo: `val res = fut()`.
270
267<
10000
/code>
271
-
Adicionalmente, utilizando el método `isSet`, un `Future` puede ser consultado
268
+
Adicionalmente, utilizando el método `isSet`, un `Future` puede ser consultado
272
269
de manera no bloqueante para comprobar si el resultado está disponible.
273
270
274
271
Un mensaje "send-with-future" no es el único modo de obtener una referencia a
@@ -286,7 +283,7 @@ recepción de mensajes como `receive`, etc. Además, es posible utilizar las ope
286
283
basadas en eventos `react`y `reactWithin`. Esto permite a un actor esperar por el
287
284
resultado de un future sin la necesidad de bloquear el hilo subyacente.
288
285
289
-
Las operaciones de recepción basadas en actores están disponibles a través del
286
+
Las operaciones de recepción basadas en actores están disponibles a través del
290
287
atributo `inputChannel` del future. Dado un future de tipo `Future[T]`, el tipo
291
288
de `inputChannel` es `InputChannel[T]`. Por ejemplo:
292
289
@@ -305,28 +302,28 @@ jerarquía de canales se divide en `OutputChannel` e `InputChannel`.
305
302
Los `OutputChannel` pueden ser utilizados para enviar mensajes. Un
306
303
`OutputChannel``out` soporta las siguientes operaciones:
307
304
308
-
-`out ! msg`. Envía el mensaje `msg` a `out` de manera asíncrona. Cuando `msg`
309
-
es enviado directamente a un actor se incluye un referencia al actor emisor
305
+
-`out ! msg`. Envía el mensaje `msg` a `out` de manera asíncrona. Cuando `msg`
306
+
es enviado directamente a un actor se incluye un referencia al actor emisor
310
307
del mensaje.
311
308
312
-
-`out forward msg`. Reenvía el mensaje `msg` a `out` de manera asíncrona.
309
+
-`out forward msg`. Reenvía el mensaje `msg` a `out` de manera asíncrona.
313
310
El actor emisor se determina en el caso en el que `msg` es reenviado a
314
311
un actor.
315
312
316
313
-`out.receiver`. Retorna el único actor que está recibiendo mensajes que están
317
314
siendo enviados al canal `out`.
318
315
319
-
-`out.send(msg, from)`. Envía el mensaje `msg` a `out` de manera asíncrona,
316
+
-`out.send(msg, from)`. Envía el mensaje `msg` a `out` de manera asíncrona,
320
317
proporcionando a `from` como el emisor del mensaje.
321
318
322
319
Nótese que el trait `OutputChannel` tiene un parámetro de tipo que especifica el
323
-
tipo de los mensajes que pueden ser enviados al canal (utilizando `!`, `forward`,
320
+
tipo de los mensajes que pueden ser enviados al canal (utilizando `!`, `forward`,
324
321
y `send`). Este parámetro de tipo es contra-variante:
325
322
326
323
trait OutputChannel[-Msg]
327
324
328
325
Los actores pueden recibir mensajes de un `InputChannel`. Del mismo modo que
329
-
`OutputChannel`, el trait `InputChannel` presenta un parámetro de tipo que
326
+
`OutputChannel`, el trait `InputChannel` presenta un parámetro de tipo que
330
327
especifica el tipo de mensajes que pueden ser recibidos por el canal. En este caso,
331
328
el parámetro de tipo es covariante:
332
329
@@ -376,7 +373,7 @@ El siguiente ejemplo muestra la compartición mediante publicación en ámbitos:
376
373
La ejecución de este ejemplo imprime la cadena "5" en la consola. Nótese que el
377
374
actor `child` únicamente tiene acceso a `out`, que es un `OutputChannel[String]`.
378
375
La referencia al canal, la cual puede ser utilizada para llevar a cabo la recepción
379
-
de mensajes, se encuentra oculta. Sin embargo, se deben tomar precauciones y
376
+
de mensajes, se encuentra oculta. Sin embargo, se deben tomar precauciones y
380
377
asegurarse que el canal de salida es inicializado con un canal concreto antes de que
381
378
`child` le envíe ningún mensaje. En el ejemplo que nos ocupa, esto es llevado a cabo
382
379
mediante el mensaje "go". Cuando se está recibiendo de `channel` utilizando el método
@@ -403,14 +400,14 @@ El siguiente fragmento de código muestra un sencillo ejemplo de aplicación:
403
400
}
404
401
405
402
La "case class" `ReplyTo` es un tipo de mensajes que utilizamos para distribuir
406
-
una referencia a un `OutputChannel[String]`. Cuando el actor `child` recibe un
403
+
una referencia a un `OutputChannel[String]`. Cuando el actor `child` recibe un
407
404
mensaje de tipo `ReplyTo` éste envía una cadena a su canal de salida. El segundo
408
405
actor recibe en el canal del mismo modo que anteriormente.
409
406
410
407
## Planificadores
411
408
412
409
Un `Reactor`(o una instancia de uno de sus subtipos) es ejecutado utilizando un
413
-
*planificador*. El trait `Reactor` incluye el miembro `scheduler` el cual retorna el
410
+
*planificador*. El trait `Reactor` incluye el miembro `scheduler` el cual retorna el
414
411
planificador utilizado para ejecutar sus instancias:
415
412
416
413
def scheduler: IScheduler
@@ -424,8 +421,8 @@ en muchas ocasiones.
424
421
Los planificadores por defecto utilizados para ejecutar instancias de `Reactor` y
425
422
`Actor` detectan cuando los actores han finalizado su ejecución. En el momento que esto
426
423
ocurre, el planificador se termina a si mismo (terminando con cualquier hilo que estuviera
427
-
en uso por parte del planificador). Sin embargo, algunos planificadores como el
428
-
`SingleThreadedScheduler` (definido en el paquete `scheduler`) necesita ser terminado de
424
+
en uso por parte del planificador). Sin embargo, algunos planificadores como el
425
+
`SingleThreadedScheduler` (definido en el paquete `scheduler`) necesita ser terminado de
429
426
manera explícita mediante la invocación de su método `shutdown`).
430
427
431
428
La manera más sencilla de crear un planificador personalizado consisten en extender la clase
@@ -438,7 +435,7 @@ la ejecución del argumento por nombre `fun`.
438
435
439
436
## Actores remotos
440
437
441
-
Esta sección describe el API de los actores remotos. Su principal interfaz es el objecto
438
+
Esta sección describe el API de los actores remotos. Su principal interfaz es el objecto
Copy file name to clipboardExpand all lines: news/_posts/2012-12-12-functional-programming-principles-in-scala-impressions-and-statistics.md
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -85,12 +85,12 @@ The collected numbers are markedly different. In no small part this is due to th
85
85
We'd like to close with some fun, and partially surprising, information on the demographics of those who took the course and completed our survey. Here is a world map showing the number of participants per country— darker colors indicate a larger number of students per-country:
86
86
87
87
<divstyle="text-align: center;"><h6>Absolute Number of Participants Per Country</h6><divid="map-population"style="width: 700px; height: 350px;"> </div></div>
88
-
<p> </p><p> </p>
88
+
<p> </p><p> </p>
89
89
90
90
Here's that graph again, relating that population of students who enrolled in the course with the population of the respective country:
91
91
92
92
<divstyle="text-align: center;"><h6>Number of Participants Per Country Relative to Countries' Population</h6><divid="map-density"style="width: 700px; height: 350px;"> </div></div>
0 commit comments