当前位置: 首页 > news >正文

中国空间站合作国家名单有关网站排名的论文

中国空间站合作国家名单,有关网站排名的论文,品牌设计的意义,西安优化官网公司1、isolate 机制 1.1 基本使用 Dart 是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求#xff0c;这种耗时操作会堵塞我们的代码。因此 Dart 也有并发机制 —— isolate。APP 的启动入口main函数就是一个类似 Android 主线程的一个主 isolate。与…1、isolate 机制 1.1 基本使用 Dart 是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求这种耗时操作会堵塞我们的代码。因此 Dart 也有并发机制 —— isolate。APP 的启动入口main函数就是一个类似 Android 主线程的一个主 isolate。与 Java 的 Thread 不同的是Dart 中的 isolate 无法共享内存因此也有称 isolate 是像进程一样的线程。 在 Dart 中Isolate隔离区是一种独立运行的执行单元它是 Dart 并发模型的基本组成部分。每个 Isolate 都有自己的内存堆独立于其他 Isolate并且彼此之间不共享内存。 Isolate 可以并行执行代码使多个任务可以同时运行而互不干扰。每个 Isolate 都有自己的事件循环event loop可以独立地处理事件和执行任务。 通过使用 Isolate您可以将应用程序的工作负载分发到多个 Isolate 中从而实现并发处理和利用多核处理器的能力。 每个 isolate 都有一个 ReceivePortReceivePort 内又有一个 SendPort可以将 SendPort 发送给对端的 isolate这样就能实现两个 isolate 彼此通信了 示例代码 import dart:io; import dart:isolate;int i 0;void main() {i 10;// 主 isolate 的 ReceivePortvar receivePort ReceivePort();// 创建子 isolate传入主 isolate 的 SendPortIsolate.spawn(isolateSub, receivePort.sendPort);// 接收其他 isolate 发来的消息receivePort.listen((message) {// 如果对端发过来 sendPort则主 isolate 也可以向对端的 isolate 发送消息if (message is SendPort) {message.send(主 isolate 接收到 SendPort);} else {print(接到子 isolate 消息:$message\n);}});// 休眠 5s 测试sleep(Duration(seconds: 5)); }/// 新 isolate 的入口函数 void isolateSub(SendPort sendPort) {// isolate 是内存隔离的i 的值是在子 isolate 中没有修改因此为 0print(i);// 创建子 isolate 的 SendPort 并发给主 isolatevar receivePort ReceivePort();sendPort.send(receivePort.sendPort);// 向主 isolate 发送消息sendPort.send(子 isolate 发送的消息~);// 监听其他 isolate 发来的消息receivePort.listen((message) {print(接到主isolate消息:$message\n);}); }这段代码要注意两个问题 ReceivePort 在使用完毕后要通过 close() 关闭掉在 main 中给 receivePort 设置完监听之后 sleep 了 5 秒目的是测试消息的收发情况结果是先输出了 isolateSub() 打印的 i 的 0 值然后隔了 5 秒主 isolate 和子 isolate 才陆续输出接收到的消息。说明 Dart 真的是单线程 可以将 isolate 看成 Java 线程只不过线程空间不共享。 1.2 Event-Loop 上面提到如果在 main() 中休眠 5 秒那么主与子 isolate 接收消息也会延后 5 秒。这是因为 Dart 与 Android 一样都是事件驱动的通过 Event-Loop 不停的从队列中获取消息或者事件来驱动整个应用的运行。isolate 发过来的消息就是通过 Event-Loop 处理。但是与 Android 不同的是Android 中每个线程只有一个 Looper 所对应的 MessageQueue而 Dart 中有两个队列一个叫做 Event queue事件队列另一个叫做 Microtask queue(微任务队列) Dart 在执行完 main 函数后就会由 Loop 开始执行两个任务队列中的 Event 首先 Loop 检查微服务队列依次执行 Event当微服务队列执行完后就检查 Event queue 队列依次执行在执行 Event queue 的过程中每执行完一个 Event 就再检查一次微服务队列。所以微服务队列优先级高可以利用微服务进行插队 我们来看几个例子 import dart:io;void main() {new File(/Users/enjoy/a.txt).readAsString().then((content) {print(content);});while (true) {} }文件内容永远也无法打印出来因为 main 函数还没执行完。而 then 方法是由 Loop 检查 Event queue 执行的。 void main() {var receivePort ReceivePort();receivePort.listen((message) {print(message);});receivePort.sendPort.send(发送消息1);Future.microtask(() print(执行微任务1));receivePort.sendPort.send(发送消息2);Future.microtask(() print(执行微任务2));receivePort.sendPort.send(发送消息3);Future.microtask(() print(执行微任务3)); }输出的结果是 执行微任务1 执行微任务2 执行微任务3 发送消息1 发送消息2 发送消息3这是因为微服务队列优先级高Loop 在 main() 执行完开始处理消息时先去微服务队列看到队列中有三个任务就都执行了然后才去 Event queue 中执行任务每执行完一个任务还要再去微服务队列中看一下是否有任务要插队进行在这个例子中没有所以才接连执行了“发送消息1”、“发送消息2”、“发送消息3”。 2、Future Future 表示事件队列中一个事件的结果通常异步函数返回的对象就是一个 Future。当一个 Future 执行完后他里面的值就可以使用了可以通过 then() 在 Future 完成时执行其他代码 void main() {// readAsString() 返回 FutureStringFile(rD:\a1.txt).readAsString().then((value) print(value)); }2.1 异常处理 当给到一个不存在的文件地址时会发生异常这时候可以利用 catchError 捕获此异常 // then().catchError() 模式就是异步的 try-catch void main() {File(rD:\a2.txt).readAsString().then((value) print(value)).catchError((e, s) {print(e);}); }会打印输入如下信息 PathNotFoundException: Cannot open file, path D:\a2.txt (OS Error: 系统找不到指定的文件。 , errno 2)2.2 组合 then()的返回值同样是一个 Future 对象可以利用队列的原理进行组合异步任务 void main() {File(rD:\a1.txt).readAsString().then((value) {print(value);// 1 被转化为 Futureint 类型返回return 1;}).then((value) print(value)); }上面是等待执行完成读取文件之后再执行一个新的 Future。如果我们需要等待一组任务都执行完再统一处理一些事情可以通过wait()完成 var readFuture File(rD:\a1.txt).readAsString(); var delayedFuture Future.delayed(const Duration(seconds: 3));Future.wait([readFuture, delayedFuture]).then((value) {print(value[0]); // 第一个 Future 的结果即文件中的字符串print(value[1]); // 第二个 Future 的结果null });3、Stream Stream也就是流表示发出的一系列的异步数据。Stream 是一个异步数据源它是 Dart 中处理异步事件流的统一 API。 3.1 基本使用 Future 表示稍后获得的一个数据所有异步的操作的返回值都用 Future 来表示。但是 Future 只能表示一次异步获得的数据。而 Stream 表示多次异步获得的数据。比如 IO 处理的时候每次只会读取一部分数据和一次性读取整个文件的内容相比Stream 的好处是处理过程中内存占用较小。而 File 的 readAsString()是一次性读取整个文件的内容进来虽然获得完整内容处理起来比较方便但是如果文件很大的话就会导致内存占用过大的问题。 new File(/Users/enjoy/app-release.apk).openRead().listen((Listint bytes) {print(stream执行); // 执行多次});new File(/Users/enjoy/app-release.apk).readAsBytes().then((_){print(future执行); // 执行1次});以读取文件内容为例如果文件太大不足以一次读取完Stream 就会分多次读取但是 Future 还是会一次读取完整个文件的内容。 Stream 的 listen() 其实就是订阅这个 Stream它会返回一个 StreamSubscription即订阅者。订阅者可以通过 cancel() 取消订阅通过 onData() 重置 listen()还有其他可调用方法如下所示 var streamSubscription File(rD:\a1.txt).openRead().listen((Listint bytes) {print(Stream 执行);});// 重置 listen 方法 streamSubscription.onData((_) {print(替代 listen); });// 监听结束 streamSubscription.onDone(() {print(结束); });// 发生异常 streamSubscription.onError((e,s){print(异常); });// 暂停如果没有继续则会退出程序 streamSubscription.pause(); // 恢复 streamSubscription.resume(); // 取消监听 streamSubscription.cancel();3.2 广播模式 Stream 有单订阅和多订阅两种模式默认是单订阅可以通过 Stream.asBroadcastStream() 将单订阅变为多订阅 var stream new File(/Users/enjoy/app-release.apk).openRead();stream.listen((Listint bytes) {});// 错误 单订阅只能有一个订阅者// stream.listen((_){// print(stream执行);// });var broadcastStream new File(/Users/enjoy/app-release.apk).openRead().asBroadcastStream();broadcastStream.listen((_){print(订阅者1);});broadcastStream.listen((_){print(订阅者2);});可以通过 isBroadcast 属性判断当前 Stream 所处的模式。 除了使用 Stream.asBroadcastStream() 将已经存在的 Stream 由单订阅变为多订阅之外也可以使用 StreamController.broadcast() 直接创建一个多订阅的 Stream只不过这样创建的 Stream如果不及时添加订阅者可能会丢失数据 void test() {// 1.由单订阅转换为多订阅的 Stream 具有粘性var stream Stream.fromIterable([1, 2, 3]);Timer(Duration(seconds: 3), () stream.listen(print));// 2.通过 StreamController 创建的 Stream 没有粘性var streamController StreamController.broadcast();streamController.add(1);// 先发出事件再订阅无法接到通知streamController.stream.listen((event) {print(event);});// 关闭streamController.close(); }输出结果为 1 2 3也就是在 stream 上先发送消息后订阅是可以收到消息的由单订阅转为多订阅的 Stream 本质上还是单订阅的但是对 streamController 的 stream 就不行。 4、async/await 当我们需要获得 A 的结果再执行 B 时你需要then()-then()利用async与await能够非常好的解决回调地狱的问题。比如说读取文件的操作一般要异步执行但是读取多个文件时有先后顺序那么就可以将读取操作先放入异步方法中然后在方法内对每个读取文件的操作都加上 await 变为同步操作 /// async 表示这是一个异步方法,await 必须在 async方法中使用 /// 异步方法只能返回 void 或 Future FutureString readFile() async {// await 等待 Future 执行完成再执行后续代码即阻塞String content await File(/Users/a.txt).readAsString();String content2 await File(/Users/b.txt).readAsString();// 自动转换为 futurereturn $content$content2; }简言之async 与 await 搭配使用可以将异步变为同步简化操作避免回调地狱。
http://www.pierceye.com/news/899671/

相关文章:

  • 权威网站设计wordpress通知站点360搜索
  • 做靓号网站凡客小程序
  • 创建网站开发公司公司做个网站
  • 做网站的工具+论坛html怎么自己做网站
  • 土木在线seo网站快速整站优化技术
  • 创造力网站设计建设有限公司网站
  • 如何做网站好看做h5小程序的网站
  • 济宁网站建设价格做网站公司深
  • ae成品免费下载网站申请一个app多少钱
  • 我想自己在网站上发文章 怎样做免费观看高清正能量直播下载
  • 做网站万网长春建站模板展示
  • 广州专业建网站公司福州网站制作
  • 西安烽盈网站建设郑州营销网站托管
  • 诸几建设银行网站怎么维护好网站
  • 深圳市国外网站建设简单html5网页设计
  • 网站制作公司西南城乡建设部网站首页
  • 网站名和域名能一样吗企业网站建设硬件
  • 德州做网站公司怎么开网店淘宝
  • 苏州做网站优化的电商定制开发
  • 广西庆海建设发展有限公司网站昆山有做网站的公司吗
  • 前端课程网站wordpress 微博登陆
  • asp怎么做网站适配开发公司安置房项目工程推进大会
  • 学做网站可以赚钱吗怎么批量修改wordpress文章内容
  • 写作网站vir上海博大园林建设发展有限公司网站
  • wordpress video gallery网站代码优化怎么做
  • 厦门网站设计品牌企业互联网门户网站建设
  • 做名片模板网站中文响应式网站
  • 用tornado做网站石家庄 外贸网站建设公司
  • 档案网站建设网页wordpress keyshot
  • 鞍山制作网站哪家好建设银行员工网站