Nuestro team especializado luego de ciertos días de investigación y de recopilar de información, obtuvieron la solución, queremos que te sea útil en tu proyecto.
Solución:
A Future
es un identificador que le permite recibir una notificación cuando se completa la ejecución asincrónica. La ejecución asíncrona utiliza la cola de eventos y el código se ejecuta simultáneamente dentro del mismo subproceso.
https://webdev.dartlang.org/articles/performance/event-loop
El código Dart se ejecuta de forma predeterminada en el aislamiento raíz.
Puede iniciar aislamientos adicionales que normalmente se ejecutan en otro subproceso. Un aislado se puede cargar desde el mismo código Dart con el que se inició el aislado raíz (con un punto de entrada diferente al main()
https://api.dartlang.org/stable/2.0.0/dart-isolate/Isolate/spawn.html) o con un código Dart diferente (cargado desde algún archivo Dart o URL https://api.dartlang.org/stable /2.0.0/dart-isolate/Isolate/spawnUri.html).
Los aislados no comparten ningún estado y solo pueden comunicarse mediante el paso de mensajes (SendPort/ReceivePort). Cada aislado tiene su propia cola de eventos.
https://webdev.dartlang.org/articles/performance/event-loop
En una frase podríamos decir,
Aislamientos: Dart es de subproceso único, pero es capaz de hacer cosas de subprocesos múltiples utilizando Isolates (muchos procesos).
Futuro: Future es un resultado que se devuelve cuando dart ha terminado un trabajo asíncrono. El trabajo generalmente se realiza en ese hilo único.
Un Isolate ejecuta el código Dart en un solo hilo. Código síncrono como
print('hello');
se ejecuta inmediatamente y no se puede interrumpir.
Un Isolate también tiene un bucle de eventos que utiliza para programar tareas asincrónicas. Asincrónico no significa que estas tareas se ejecuten en un subproceso separado. Todavía se ejecutan en el mismo hilo. Asíncrono solo significa que están programados para más tarde.
El bucle de eventos ejecuta las tareas que están programadas en lo que se denomina una cola de eventos. Puede poner una tarea en la cola de eventos creando un futuro como este:
Future(() => print(hello));
los print(hello)
La tarea se ejecutará cuando las otras tareas anteriores en la Cola de eventos hayan terminado. Todo esto está sucediendo en el mismo hilo, es decir, el mismo Isolate.
Algunas tareas no se agregan a la cola de eventos de inmediato, por ejemplo
Future.delayed(Duration(seconds: 1), () => print('hello'));
que solo se agrega a la cola después de un retraso de un segundo.
Hasta ahora todo lo que he estado hablando se hace en el mismo hilo, el mismo Isolate. Sin embargo, es posible que parte del trabajo se realice en un subproceso diferente, como las operaciones de E/S. El marco subyacente se encarga de eso. Si se hiciera algo costoso como leer desde el disco en el subproceso principal de Aislar, bloquearía la aplicación hasta que terminara. Cuando finaliza la operación IO, el futuro se completa y la actualización con el resultado se agrega a la cola de eventos.
Cuando necesite realizar operaciones intensivas de CPU usted mismo, debe ejecutarlas en otro aislado para que no provoque bloqueos en su aplicación. La propiedad de cálculo es buena para esto. Todavía usa un futuro, pero esta vez el futuro está devolviendo el resultado de un Isolate diferente.
Estudio adicional
- Futuros – Aislados – Bucle de eventos
- Programación asincrónica de Dart: aislamientos y bucles de eventos
- ¿Están los futuros en los hilos de Dart?
- El bucle de eventos y el dardo
- Desmitificación sin bloqueo de Flutter/Dart
- La arquitectura del motor
- Dardo de un solo hilo, ¿qué? – Parte 1
- Dardo de un solo hilo, ¿qué? – Parte 2
- Flutter Threading: Isolates, Future, Async y Await
- Los fundamentos de las zonas, las microtareas y los bucles de eventos en el lenguaje de programación Dart
- Una introducción a la biblioteca dart:io
- ¿En qué subproceso/aislamiento ejecuta flutter las operaciones de E/S?