Dart学习 Future 异步/ Isolate 隔离

2024-01-31 11:08:58 浏览数 (1)

Dart 中的并发

Futrue 如果使用了async 异步亲求,返回的类型一定要是Future类型的。

Future 调用类似于 promise ,相当于是微任务。

代码语言:javascript复制
void main(List<String> args) {

 print('start');

 Future(() { // 异步执行

 print('111111111');

  });

 Future.sync(() { // 同步执行

 print('22222');

  });

 Future.delayed(Duration(seconds: 2), () { // 可以指定延迟多久执行

 print('3333333');

  });

 print('end');

}

// 打印结果

// start

// 22222

// end

// 111111111

// 22222

除了可以使用async和awite Future 也可以使用.then .cacth来获取结果。类似返回一个promise对象

代码语言:javascript复制
import 'dart:io';

void main(List<String> args) {

 print('start');

 req().then((value) {

 print(value);

  });

 print('end');

}

Future req() {

 return Future(() {

 sleep(Duration(seconds: 2));

 return '模拟请求';

  });

}

// 打印结果

// start

// end

// 模拟请求

Future 也可以像promise一样链式调用。之前js的写法是可以的 还可以return 另一个Future对象,进行链式调用

代码语言:javascript复制
import 'dart:io';

void main(List<String> args) {

 // req().then((value) {

 //   print(value);

 //   req2(value).then((v2) {

 //     print(v2);

 //   });

 // });

 // 返回一个新的Future  可以进行链式调用 与上面的写法 结果一致

 req().then((value) {

 print(value);

 return req2(value);

  }).then((value) {

 print(value);

  });

}

Future req() {

 return Future(() {

 sleep(Duration(seconds: 2));

 return '模拟请求';

  });

}

Future req2(value) {

 return Future(() {

 sleep(Duration(seconds: 2));

 return '第二个请求';

  });

}

也可以使用async 和 await,将异步代码同步的写出,去掉了.then的链式调用

代码语言:javascript复制
void main(List<String> args) async{

 String value = await req();

 String value2 = await req2(value2);

 print(value);

 print(value2);

}

Future.wait 类似于Promise.all

这里调用上面写过的两个方法,结果是两个返回值组成的数组

代码语言:javascript复制
void main(List<String> args) {

 Future.wait([req(), req2(23)]).then((value) {

 print(value);

 // 等待传入的异步都执行完毕再操作

  });

}
代码语言:javascript复制
void main(List<String> args) async{

 var res = Future.wait([req(), req2(23)])

 print(res);

}

Ioslate 隔离

将原本单线程的内容模拟成“多线程”,在主线程中创建新的隔离执行耗时任务,不会阻塞主线程的执行,执行完成后再通过管道将结果输送给主线程

代码语言:javascript复制
import 'dart:io';

import 'dart:isolate';

void main(List<String> args) async {

 print('start');

 // 通过自带的ioslate 中的ReceivePort 来创建管道,需要再Isolate.spawn 第二个参数传入。

 ReceivePort port = ReceivePort();

 // 创建隔离,传入执行的任务,一级管道

 var taskres = await Isolate.spawn(task, port.sendPort);

 // 通过listen 方法接收 send传递的内容。

  port.listen((message) {

 print(message);

 // 操作结束后要关闭管道

    port.close();

 // 杀死线程

    taskres.kill();

  });

 print('end');

}

void task(SendPort port) {

 sleep(Duration(seconds: 2));

 // 隔离的参数返回内容需要调用 port.send

 return port.send('task finash');

}

0 人点赞