前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Dart中的任务执行队列

Dart中的任务执行队列

原创
作者头像
ruochen
修改于 2021-11-22 01:25:54
修改于 2021-11-22 01:25:54
2.8K0
举报

任务执行队列

1、Dart任务的执行顺序

① 先执行MicroTask Queue中的MicroTask

MicroTask Queue执行完之后,执行Event Queue中的Event

③ 每次都会判断是否有新的MicroTask和新的Event,优先执行MicroTask

2、MicroTask创建方法

scheduleMicrotask(() {});

Future.microtask(() {});

3、Event创建方法

async异步方法属于Event


Isolate

1、什么是Isolate

字面意思是隔离,即每个Isolate是独立的,隔离的,内存不共享的。

官方文档或注释的一部分:

All Dart code runs in an isolate, and code can access classes and values only from the same isolate.

所有的 Dart 代码运行在一个 Isolate 里,代码只能访问同一个 Isolate 里的类和值。

Different isolates can communicate by sending values through ports.

不同的 isolate 能够通过 port 发送值进行交流。

An isolate is what all Dart code runs in. It’s like a little space on the machine with its own, private chunk of memory and a single thread running an event loop.

所有 Dart 代码运行在一个 Isolate 里,它像机器上的一个小空间,有自己的私有内存块和运行事件循环的单个线程。

2、两种方式可以生成Isolate

Isolate.spawn

compute()

3、Isolate是如何实现内存隔离的

参考文章:[ Dart 中的

Isolate](https://links.jianshu.com/go?to=https%3A%2F%2Fblog.csdn.net%2Fjoye123%2Farticle%2Fdetails%2F102913497)

这里的内存指的就是堆内存,每个Isolate的堆内存是随着Isolate的创建而初始化。

4、Isolate之间的通信

DartVM支持的消息数据类型为:

① 原始数类型,如nullbooldoubleintString

SendPort实例,比如ReceivePort().sendPort

③ 包含①和②的listmap,也可以嵌套

④ 在DartVM中,处于同一进程的2个Isolate,也可以发送自定义的Class实例对象,但dart2js编译器不可以。

5、创建Isolate示例

① 创建Isolate

② 准备获取发送过来的数据

③ 将2边sendPort进行绑定

④ 创建监听,监听那边发过来的数据和SendPort

⑤ 开始往那边发送数据和SendPort

⑥ 等待那边处理数据

⑦ 监听到了那边发过来的数据和SendPort

⑧ 用拿到的数据进行大量的计算

⑨ 开始大量计算

⑩ 将计算完的数据发到那边

代码语言:txt
AI代码解释
复制
import 'dart:async';
代码语言:txt
AI代码解释
复制
import 'dart:isolate';
代码语言:txt
AI代码解释
复制
import 'package:flutter/material.dart';
代码语言:txt
AI代码解释
复制
void main() {
代码语言:txt
AI代码解释
复制
  runApp(MyApp());
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
class MyApp extends StatelessWidget {
代码语言:txt
AI代码解释
复制
  @override
代码语言:txt
AI代码解释
复制
  Widget build(BuildContext context) {
代码语言:txt
AI代码解释
复制
    return MaterialApp(
代码语言:txt
AI代码解释
复制
      title: 'Flutter Demo',
代码语言:txt
AI代码解释
复制
      theme: ThemeData(
代码语言:txt
AI代码解释
复制
        primarySwatch: Colors.blue,
代码语言:txt
AI代码解释
复制
      ),
代码语言:txt
AI代码解释
复制
      home: HomePage(),
代码语言:txt
AI代码解释
复制
    );
代码语言:txt
AI代码解释
复制
  }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
class HomePage extends StatelessWidget {
代码语言:txt
AI代码解释
复制
  const HomePage({Key? key}) : super(key: key);
代码语言:txt
AI代码解释
复制
  @override
代码语言:txt
AI代码解释
复制
  Widget build(BuildContext context) {
代码语言:txt
AI代码解释
复制
    return Scaffold(
代码语言:txt
AI代码解释
复制
      appBar: AppBar(),
代码语言:txt
AI代码解释
复制
      body: Column(
代码语言:txt
AI代码解释
复制
        children: [
代码语言:txt
AI代码解释
复制
          MaterialButton(
代码语言:txt
AI代码解释
复制
            color: Colors.red,
代码语言:txt
AI代码解释
复制
            onPressed: test,
代码语言:txt
AI代码解释
复制
            child: Text('测试'),
代码语言:txt
AI代码解释
复制
          ),
代码语言:txt
AI代码解释
复制
        ],
代码语言:txt
AI代码解释
复制
      ),
代码语言:txt
AI代码解释
复制
    );
代码语言:txt
AI代码解释
复制
  }
代码语言:txt
AI代码解释
复制
  void test() {
代码语言:txt
AI代码解释
复制
    asyncFibonacci(3).then((value) {
代码语言:txt
AI代码解释
复制
      print('执行:11'); // ----> 11. 拿到返回值
代码语言:txt
AI代码解释
复制
      print(value);
代码语言:txt
AI代码解释
复制
    });
代码语言:txt
AI代码解释
复制
    /*
代码语言:txt
AI代码解释
复制
    flutter: 执行:1
代码语言:txt
AI代码解释
复制
    flutter: 执行:2
代码语言:txt
AI代码解释
复制
    flutter: 执行:3
代码语言:txt
AI代码解释
复制
    flutter: 执行:4
代码语言:txt
AI代码解释
复制
    flutter: 执行:5
代码语言:txt
AI代码解释
复制
    flutter: 执行:6
代码语言:txt
AI代码解释
复制
    flutter: 执行:7
代码语言:txt
AI代码解释
复制
    flutter: 执行:8
代码语言:txt
AI代码解释
复制
    flutter: 执行:9
代码语言:txt
AI代码解释
复制
    flutter: 执行:9
代码语言:txt
AI代码解释
复制
    flutter: 执行:9
代码语言:txt
AI代码解释
复制
    flutter: 执行:9
代码语言:txt
AI代码解释
复制
    flutter: 执行:9
代码语言:txt
AI代码解释
复制
    flutter: 执行:10
代码语言:txt
AI代码解释
复制
    flutter: 执行:11
代码语言:txt
AI代码解释
复制
    flutter: 2
代码语言:txt
AI代码解释
复制
     */
代码语言:txt
AI代码解释
复制
  }
代码语言:txt
AI代码解释
复制
  /// 创建Isolate来计算斐波那契数列第n个数
代码语言:txt
AI代码解释
复制
  /// n从0开始
代码语言:txt
AI代码解释
复制
  Future<dynamic> asyncFibonacci(int n) async {
代码语言:txt
AI代码解释
复制
    /// 创建Isolate
代码语言:txt
AI代码解释
复制
    /// 创建一个ReceivePort
代码语言:txt
AI代码解释
复制
    /// Isolate所需参数,必须要有SendPort,SendPort需要ReceivePort创建
代码语言:txt
AI代码解释
复制
    final receivePort = ReceivePort();
代码语言:txt
AI代码解释
复制
    /// 第一个参数entryPoint:必须是一个顶层方法或静态方法
代码语言:txt
AI代码解释
复制
    /// 第二个参数message:通常初始化message包含一个sendPort
代码语言:txt
AI代码解释
复制
    print('执行:1'); // ----> 1. 创建Isolate
代码语言:txt
AI代码解释
复制
    await Isolate.spawn(_isolateTopLevelFunction, receivePort.sendPort);
代码语言:txt
AI代码解释
复制
    /// 获取sendPort来发送数据
代码语言:txt
AI代码解释
复制
    print('执行:2'); // ----> 2. 准备获取发送过来的数据
代码语言:txt
AI代码解释
复制
    final sendPort = await receivePort.first as SendPort;
代码语言:txt
AI代码解释
复制
    /// 接收消息的receivePort
代码语言:txt
AI代码解释
复制
    final answerReceivePort = ReceivePort();
代码语言:txt
AI代码解释
复制
    /// 发送数据
代码语言:txt
AI代码解释
复制
    print('执行:5'); // ----> 5. 开始往那边发送数据和SendPort
代码语言:txt
AI代码解释
复制
    sendPort.send([Calculate(count: n), answerReceivePort.sendPort]);
代码语言:txt
AI代码解释
复制
    /// 获取数据并返回
代码语言:txt
AI代码解释
复制
    print('执行:6'); // ----> 6. 等待那边处理数据
代码语言:txt
AI代码解释
复制
    return answerReceivePort.first;
代码语言:txt
AI代码解释
复制
  }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
/// Isolate的顶级方法
代码语言:txt
AI代码解释
复制
void _isolateTopLevelFunction(SendPort sendPort) {
代码语言:txt
AI代码解释
复制
  final receivePort = ReceivePort();
代码语言:txt
AI代码解释
复制
  /// 绑定
代码语言:txt
AI代码解释
复制
  print('执行:3'); // ----> 3. 将2边sendPort进行绑定
代码语言:txt
AI代码解释
复制
  sendPort.send(receivePort.sendPort);
代码语言:txt
AI代码解释
复制
  /// 监听
代码语言:txt
AI代码解释
复制
  print('执行:4'); // ----> 4. 创建监听,监听那边发过来的数据和SendPort
代码语言:txt
AI代码解释
复制
  receivePort.listen((message) {
代码语言:txt
AI代码解释
复制
    print('执行:7'); // ----> 7. 监听到了那边发过来的数据和SendPort
代码语言:txt
AI代码解释
复制
    /// 获取数据并解析
代码语言:txt
AI代码解释
复制
    final data = message[0] as Calculate;
代码语言:txt
AI代码解释
复制
    final send = message[1] as SendPort;
代码语言:txt
AI代码解释
复制
    /// 返回结果
代码语言:txt
AI代码解释
复制
    print('执行:8'); // ----> 8. 用拿到的数据进行大量的计算
代码语言:txt
AI代码解释
复制
    int num = syncFibonacci(data.count);
代码语言:txt
AI代码解释
复制
    print('执行:10'); // ----> 10. 将计算完的数据发到那边
代码语言:txt
AI代码解释
复制
    send.send(num);
代码语言:txt
AI代码解释
复制
  });
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
/// 同步的斐波那契计算顶级方法
代码语言:txt
AI代码解释
复制
int syncFibonacci(int n) {
代码语言:txt
AI代码解释
复制
  print('执行:9'); // ----> 9. 开始大量计算
代码语言:txt
AI代码解释
复制
  return n < 2 ? n : syncFibonacci(n - 2) + syncFibonacci(n - 1);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
class Calculate {
代码语言:txt
AI代码解释
复制
  int count;
代码语言:txt
AI代码解释
复制
  Calculate({required this.count});
代码语言:txt
AI代码解释
复制
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
超越村后端开发(2:新建models.py+xadmin的引入)
1.新建Model 1.users数据 1.在apps/users/models.py中: from datetime import datetime from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserProfile(AbstractUser): """ 管理员 """ name=mod
玩蛇的胖纸
2019/04/09
5100
超越村后端开发(2:新建models.py+xadmin的引入)
Django+xadmin打造在线教育平台(一)
代码 github下载  一、前言 代码下载:  开发环境:     python:  3.6.4     Django: 2.0.2 后台管理:xadmin 1.1.项目介绍 系统概括: 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。 导航栏: 公开课,授课讲师,授课机构,全局搜索。 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。 点击课程–> 课程详情页中对课程进行收藏,
zhang_derek
2018/04/11
5.8K1
Django+xadmin打造在线教育平台(一)
Django开发在线教育平台--学习整理(一)
首先,打开cmd,cd到存放django项目的文件夹,创建一个新工程(也可以用虚拟环境virtualenv):
SimonDM
2018/05/09
3K4
Django开发在线教育平台--学习整理(一)
Django REST framework+Vue 打造生鲜超市(二)
三、Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip install djangorestframework pip install -i https://pypi.douban.com/simple django==2.0.2 pip install markdown pip install django-filter pip install pillow
zhang_derek
2018/04/11
2.2K0
Django REST framework+Vue 打造生鲜超市(二)
Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
  新版的pycharm很贴心的让每一个新的项目,都自动会在一个虚拟环境中,放心的新建项目就可以了,不用考虑虚拟环境的事儿了
玩蛇的胖纸
2018/10/10
2K0
Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
Django实战-生鲜电商-模型层
经过前几小节的介绍,ORM 的基础应用,如何把一张数据表建好,方便各张表之间的数据处理。从第一张用户表开始,就意味着整个站点的数据表能有多大的扩展能力。
小团子
2019/07/18
5690
Django实战-生鲜电商-模型层
零基础使用Django2.0.1打造在线教育网站(八):数据库字段的定义(下)
努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/08/21
8740
django_mysql_配置
1. 创建一个新的应用,为booktest,在models.py 文件中定义模型类,然后去setting注册应用
py3study
2020/01/16
1.6K0
越光后端开发——ygapi(2.新建Model)
1.新建Model 1.users数据 1.在apps/users/models.py中: from datetime import datetime from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserProfile(AbstractUser): """ 管理员 """ name=mod
玩蛇的胖纸
2019/03/15
3700
越光后端开发——ygapi(2.新建Model)
2.Models设计
1.Models设计: 1.重构用户表: 1.在users/models.py中: from django.db import models from django.contrib.auth.models import AbstractUser from datetime import datetime # Create your models here. class UserProfile(AbstractUser): """ 用户表 """ token = model
玩蛇的胖纸
2020/05/18
4030
day100-Exception继承定义错误信息&结算接口&结算数据结构
1.Exception的继承 # 自定义继承类继承 Exception class MyException(Exception): def __init__(self, code, msg): self.code = code self.msg = msg # 自定义相应信息 class BaseResponse: def __init__(self): self.code = '' self.error = ''
少年包青菜
2020/03/26
6960
Django教程 —— 初步完善图书管理系统
我们写项目写东西的时候都要养成良好的习惯,不要一来就上手写代码,我们先要进行初步分析和设计,让大脑有整体的概念,需要用到什么技术实现什么效果。这个习惯也不能学的太死,我们要活学活用,学会变通。有时候只是简单的学习一下,或者简单的实现一个小功能。大脑已经可以大概掌握,就无须设计与分析。
忆想不到的晖
2020/11/06
1K0
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入
Github和Gitee代码同步更新: https://github.com/corleytd/Django_Fresh_Ecommerce; https://gitee.com/Python_Full_Stack/Django_Fresh_Ecommerce。
cutercorley
2020/07/23
1.9K0
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入
国庆续写商品管理系统(二)
国庆有点懒散更新的内容不多,大家国庆快乐 一.做的事情 上次写到点我查看 设置中国时区 修改表单存储位置 设计商品相关的表,主要是总库存,退货,进货,销售 优化登入验证码,去除1iO0这些让人难以区分的内容 重新设计文件目录 二.配置相关 setting.py """ Django settings for drf_test project. Generated by 'django-admin startproject' using Django 1.11.22. For more informati
小小咸鱼YwY
2020/06/19
1.1K0
测试开发进阶(三十四)
数据库模型图 创建app 根据上面的数据库设计,创建9个app configures debugtalks envs interfaces projects reports testsuits tes
zx钟
2019/11/07
5000
测试开发进阶(三十四)
python测试开发django-35.xadmin注册表信息
xadmin后台如果要对表的内容增删改查,跟之前的admin.py文件里面写注册表信息一样,需在admin.py同一级目录新建一个adminx.py的文件。 然后在adminx.py文件控制页面上需显示的内容。
上海-悠悠
2019/05/06
5520
python测试开发django-35.xadmin注册表信息
BBS项目(二)
目录 BBS项目(二) ORM 创建相关表 表模型 修改admin样式 Simple-UI 注册表添加数据 注册forms类编写 注册功能前端搭建 头像实时显示功能实现 BBS项目(二) 可以在本地写或虚拟环境 添加虚拟环境 如果虚拟环境启动报错:解决 query = query.decode(errors=‘replace‘) AttributeError: ‘str‘ object has no attribute ‘decode‘ 解决办法 query = query.decode(erro
HammerZe
2022/03/24
7860
BBS项目(二)
Django Helloworld
【历史故事】似乎Python从诞生起就是各种传奇,Django 从一个非常实际的需求成长而来:World Web 是一家新闻网站,负责在新闻截止期限内建立密集的 Web 应用程序。 在快节奏的新闻编辑室,World Online 往往需要几个小时内将一个复杂的 Web 应用程序从概念推向发布上线。
vanguard
2020/03/04
1.1K0
django admin 对 list_filter 排序
1. https://cloud.tencent.com/developer/ask/34273
卓越笔记
2023/02/18
4930
django  admin 对 list_filter 排序
【愚公系列】2022年01月 Django商城项目19-商品数据表的设计
在电商项目里面为了准确的描述商品的区别,我们抽象出来两个概念,Spu和Sku这两个概念。
愚公搬代码
2022/01/26
4550
【愚公系列】2022年01月 Django商城项目19-商品数据表的设计
推荐阅读
相关推荐
超越村后端开发(2:新建models.py+xadmin的引入)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文