Caso de uso de scala.concurrent.blocking
scala-2.10 (2)
Encontré el método de scala.concurrent.blocking
, y de acuerdo con la documentación de Scala, esto es ...
Se usa para designar un fragmento de código que potencialmente bloquea, permitiendo que el BlockContext actual ajuste el comportamiento del tiempo de ejecución. Marcar correctamente el código de bloqueo puede mejorar el rendimiento o evitar interbloqueos.
Tengo algunas dudas:
- ¿Cuál es el factor con el que se engendrarán nuevos hilos?
- ¿Es aplicable solo para el contexto de ejecución
scala.concurrent.ExecutionContext.Implicits.global
o para contextos de ejecución creados por el usuario? - ¿Qué sucede si envuelvo cualquier ejecutable con
blocking {
...}
? - Cualquier caso de uso práctico donde deberíamos usar esta construcción.
- Los nuevos subprocesos se generan en el grupo fork / join cuando detecta que todos los subprocesos en el grupo fork / join están esperando el uno al otro utilizando la construcción de
join
, y hay más trabajo por completar que podría potencialmente terminar uno de los subprocesos . Alternativamente, si uno de los subprocesos deForkJoinWorker
está ejecutando código que bloquea de otra forma que no sea usandojoin
, puede notificar al grupo utilizando ManagedBlockers . - Es potencialmente aplicable a cualquier tipo de contextos de ejecución: sirve como una notificación a la implementación
ExecutionContext
que el código ejecutado por un hilo de trabajo está bloqueando potencialmente en alguna condición, y que esta condición podría resolverse mediante el cálculo de otra cosa utilizando algún otro hilo. El contexto de ejecución puede o no actuar sobre esto. En la implementación actual (2.10, 2.11), elblocking
solo funcionará con el contexto de ejecución global predeterminado. - Si ajusta cualquier ejecutable con bloqueo, inducirá un poco de sobrecarga de tiempo de ejecución, por lo que no siempre lo haga.
- Si tiene un cálculo que dura mucho tiempo, por ejemplo, segundos o minutos, o está esperando que un futuro lo complete con
Await
, o está esperando que la condición del monitor se resuelva, y esta condición puede resolverse mediante otra tarea / futuro que debe ejecutarse en el mismo contexto de ejecución: en todos estos casos, debe usar elblocking
.
EDITAR:
Considere echar un vistazo al Capítulo 4 en el Programa de Aprendizaje Simultáneo en Scala .
Siempre encontré la documentación oficial un poco pobre con respecto a la construcción de bloqueo; por lo tanto, traté de explicarlo más claramente en esta publicación de blog con ejemplos de cómo podría implementar la suya y cómo funciona bajo el capó.