Programación concurrente de Dart: aislar

Todos sabemos que en Flutterdesarrollo, se Appestá 单线程ejecutando. Ya que se está 单线程ejecutando, ¿puede manejar múltiples tareas al mismo tiempo? La respuesta es sí, antes que nada, entendamos isolate.

aísla

Aquellos que hayan estado involucrados en iOSel desarrollo anteriormente, o que hayan desarrollado aplicaciones en otras plataformas, tendrán un subproceso principal cuando la aplicación se esté ejecutando y pueden abrir múltiples subprocesos para la ejecución simultánea de múltiples tareas. En Dart, todo el código se ejecuta en isolate, cada uno isolatecon su propio 内存堆栈, asegurando que isolateel estado de cada uno sea independiente y no se afecte entre sí. Porque isolateno hay intermedio 共享的内存空间, por lo que no tenemos que usarlo 各种锁para garantizar la seguridad de los datos.

Aislamiento principal

Por defecto, todo Dartel código está en formato main isolate.

Captura de pantalla 2022-05-15 3.22.19 pm.png

Incluso un programa único aislado puede ejecutarse sin problemas si se usa para async-awaitesperar operación asincrónica y luego pasar a la siguiente línea de código. Una buena aplicación se iniciará rápidamente y luego abrirá EventLoop para responder a los eventos de eventos en la cola de eventos.

El ciclo de vida del aislado.

Como se muestra en la siguiente figura, cada aislamiento se Dartabre mediante algún código. Por ejemplo main()método. isolateAlgunos quedarán registrados en 事件监听者el proceso de usuario 交互操作o archivo I/O操作. Cuando se procesa el evento Evento y se devuelve el resultado, se isolatecerrará.

Captura de pantalla 2022-05-15 3.48.54 pm.png

Gestión de eventos

main isolateEn la aplicación del cliente, Event queuehabrá múltiples Repaintsolicitudes, algunos eventos de IU o eventos de devolución de llamada de botón. Los eventos se procesan en el orden de Event Loopla cola de eventos .先入先出Event

Captura de pantalla 2022-05-15 3.55.34 pm.pngCuando se main()llama , se ejecuta Event Handler, como se muestra en la siguiente figura:

Captura de pantalla 2022-05-15 3.58.56 pm.pngCabe señalar que si una determinada EventHandler operación de sincronización tarda demasiado, la respuesta de la aplicación se bloqueará. Como se muestra en la figura a continuación, Tap Handlerllevará demasiado tiempo y la respuesta se bloqueará si excede el tiempo de procesamiento esperado. .

Captura de pantalla 2022-05-15 4.10.14 pm.png

trabajador aislado

Al procesar 耗时的计算, por ejemplo, datos JSON más grandes. En este punto, podemos abrir otro isolatepara el análisis de datos JSON, al que llamamos this worker isolate, background isolatey cuando worker isolatese completa la ejecución, devolver el resultado a main isolate.

Captura de pantalla 2022-05-15 4.19.39 pm.png

Debe tenerse en cuenta que isolatelos datos que se pasan entre ellos deben estar satisfechos sendablePara saber qué objetos satisfacen el sendableestado, puede consultar la descripción de la API del método send() .

ejemplo de aislamiento de trabajador

void main() async {
  // Read some data.
  final jsonData = await _parseInBackground();

  // Use that data
  print('Number of JSON keys: ${jsonData.length}');
}

// Spawns an isolate and waits for the first message
Future<Map<String, dynamic>> _parseInBackground() async {
  final p = ReceivePort(); // 1
  await Isolate.spawn(_readAndParseJson, p.sendPort); // 2 
  return await p.first as Map<String, dynamic>; // 3
}

Future<void> _readAndParseJson(SendPort p) async {
  final fileData = await File(filename).readAsString();
  final jsonData = jsonDecode(fileData);
  Isolate.exit(p, jsonData);
}
复制代码
  • 1. Antes de crear isolate, cree uno para pasar datos ReceievePortde worker isolatea .main isolate
  • 2. Use para Isolate.spawn()crear uno nuevo isolatepara realizar la _readAndParseJsonoperación.
  • 3. Una vez que se crea el aislamiento, main isolatecomience a esperar que se work isolateentregue .

main isolateLa comunicación entre y work isolatecomo se muestra en la siguiente figuraCaptura de pantalla 2022-05-15 5.07.58 pm.png

La introducción de este artículo isolateestá aquí primero. Para obtener más información, consulte la documentación oficial de Dart.

Este artículo se refiere a los aislamientos oficiales del documento Dart.

Supongo que te gusta

Origin juejin.im/post/7098558405622628365
Recomendado
Clasificación