Windows 下检出代码的时候报错:
解决:
前提: 在排除没有配置公钥的情况下。
- 在Git的安装目录下
Git > etc > ssh
文件夹下找到ssh_config
文件 - 在文件末尾添加一下代码(注意,这里的 xxx.com 就是远程仓库地址或者ip,格式如:baidu.com)
参考链接
windows git ssh 方式提示 no matching host key type found. Their offer: ssh-rsa,ssh-dss
Windows 下检出代码的时候报错:
前提: 在排除没有配置公钥的情况下。
Git > etc > ssh
文件夹下找到 ssh_config
文件windows git ssh 方式提示 no matching host key type found. Their offer: ssh-rsa,ssh-dss
2021年的最后一天, Dart 官方发布了 dart 2.15
版本,该版本优化了很多内容,今天我们要重点说说 isolate
工作器。官方推文链接
在探索新变化之前,我们来回忆巩固一下 isolate 的使用。
问题:Flutter 基于单线程模式使用协程进行开发,为什么还需要 isolate ?
首先我们要明确 并行(isolate)
与并发(future)
的区别。下面我们通过简单的例子来进行说明 。Demo 是一个简单的页面,中间放置一个不断转圈的 progress
和一个按键,按键用来触发耗时方法。
future
的方式进行封装结论:使用 future
的方式来消费耗时操作,由于仍然是单线程在进行工作,异步只是在同一个线程的并发操作,仍会阻塞UI的刷新。
isolate
创建新线程,避开主线程,不干扰UI刷新结论:使用 isolate
实现了多线程并行,在新线程中进行耗时操作不会干扰UI线程的刷新。
iso 有两点较为重要的局限性。
Dart 2.15 更新, 给 iso 添加了组的概念,isolate 组
工作特征可简单总结为以下两点:
仍然阻止
在 isolate 间共享访问可变对象,但由于 isolate 组使用共享堆实现,这也让其拥有了更多的功能。官方推文中举了一个例子:
工作器 isolate 通过网络调用获得数据,将该数据解析为大型 JSON 对象图,然后将这个 JSON 图返回到主 isolate 中。
Dart 2.15 之前
:执行该操作需要深度复制,如果复制花费的时间超过帧预算时间,就会导致界面卡顿。
使用 Dart 2.15
:工作器 isolate 可以调用Isolate.exit()
,将其结果作为参数传递。然后,Dart 运行时将包含结果的内存数据从工作器 isolate 传递到主 isolate 中,无需复制,且主 isolate 可以在固定时间内接收结果。
重点:提供 Isolate.exit() 方法,将包含结果的内存数据从工作器 isolate 传递到主 isolate,过程无需复制。
附注: 使用 Dart 新特性,需将 flutter sdk 升级到 2.8.0 以上 链接。
Dart 更新后,我们将数据从 工作器 isolate(子线程)
回传到 主 isolate(主线程)
有两种方式。
send
点击进入 send 方法查看源码注释,看到这样一句话:
结论:send 本身不会阻塞,会立即发送,但可能需要线性时间成本用于复制数据。
exit
官网 给出的解释如下:
结论:隔离之间的消息传递通常涉及数据复制,因此可能会很慢,并且会随着消息大小的增加而增加。但是
exit()
,则是在退出隔离中保存消息的内存,不会被复制,而是被传输到主 isolate。这种传输很快,并且在恒定的时间内完成。
我们把上面 demo 中的 _entryPoint 方法做一下优化,修改如下:
总结:使用 exit()
替代 SendPort.send
,可规避数据复制,节省耗时。
如何创建一个 isolate 组?官方给出的解释如下:
When an isolate calls
Isolate.spawn()
, the two isolates have the same executable code and are in the same isolate group. Isolate groups enable performance optimizations such as sharing code; a new isolate immediately runs the code owned by the isolate group. Also,Isolate.exit()
works only when the isolates are in the same isolate group.
当在 isolate 中调用另一个 isolate 时,这两个 isolate 具有相同的可执行代码,并且位于同一隔离组。
PS: 小轰暂时也没有想到具体的使用场景,先暂放一边吧。
结合上面的耗时方法calculateEvenCount
,isolate 处理连续数据需要结合 stream 流的设计。具体 demo 如下: