Todos sabemos que en Flutter
desarrollo, se App
está 单线程
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 iOS
el 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 isolate
con su propio 内存堆栈
, asegurando que isolate
el estado de cada uno sea independiente y no se afecte entre sí. Porque isolate
no hay intermedio 共享的内存空间
, por lo que no tenemos que usarlo 各种锁
para garantizar la seguridad de los datos.
Aislamiento principal
Por defecto, todo Dart
el código está en formato main isolate
.
Incluso un programa único aislado puede ejecutarse sin problemas si se usa para async-await
esperar 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 Dart
abre mediante algún código. Por ejemplo main()
método. isolate
Algunos quedarán registrados en 事件监听者
el proceso de usuario 交互操作
o archivo I/O操作
. Cuando se procesa el evento Evento y se devuelve el resultado, se isolate
cerrará.
Gestión de eventos
main isolate
En la aplicación del cliente, Event queue
habrá múltiples Repaint
solicitudes, algunos eventos de IU o eventos de devolución de llamada de botón. Los eventos se procesan en el orden de Event Loop
la cola de eventos .先入先出
Event
Cuando se main()
llama , se ejecuta Event Handler
, como se muestra en la siguiente figura:
Cabe 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 Handler
llevará demasiado tiempo y la respuesta se bloqueará si excede el tiempo de procesamiento esperado. .
trabajador aislado
Al procesar 耗时的计算
, por ejemplo, datos JSON más grandes. En este punto, podemos abrir otro isolate
para el análisis de datos JSON, al que llamamos this worker isolate
, background isolate
y cuando worker isolate
se completa la ejecución, devolver el resultado a main isolate
.
Debe tenerse en cuenta que isolate
los datos que se pasan entre ellos deben estar satisfechos sendable
Para saber qué objetos satisfacen el sendable
estado, 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 datosReceievePort
deworker isolate
a .main isolate
- 2. Use para
Isolate.spawn()
crear uno nuevoisolate
para realizar la_readAndParseJson
operación. - 3. Una vez que se crea el aislamiento,
main isolate
comience a esperar que sework isolate
entregue .
main isolate
La comunicación entre y work isolate
como se muestra en la siguiente figura
La introducción de este artículo isolate
está 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.