Dart 中的线程、隔离和进程有什么区别?
据我所知,Dart 是一种单线程语言,但它可以产生许多彼此不共享内存的隔离,我们可以对它们进行繁重的工作并返回结果,而不会阻塞 UI。
但是 Process 的用途是什么,它是 Isolate 的一部分吗?谁能更详细地描述以上三个。
当我们使用
Future
进行异步编程并让我们看看我们正在其中进行繁重的工作时,如果使用 await
关键字等待它,这是否会阻塞 UI 线程。
进程是一种本机操作系统(Unix、Windows、MacOS)构造,由一个或多个具有自己的地址空间和执行环境的线程组成。 在 Dart 中,一个应用程序由一个或多个线程组成,其中一个是主 UI 线程,其余的通常称为“隔离”。
与之前的答案所述相反,所有 Dart 代码都在隔离中运行。
其实,根据你在评论中所说的,你的理解是正确的。
来自文档(强调我的):
在应用程序中,所有 Dart 代码都在隔离中运行。每个 Dart isolate 都有 单个执行线程,并且与其他线程共享无可变对象 隔离。为了相互通信,隔离使用消息 通过。虽然Dart的isolate模型是用底层构建的 操作系统所使用的原语,例如进程和线程 提供,Dart VM 对这些原语的使用是一种 实现 本页不讨论的细节。
许多 Dart 应用程序仅使用 one 隔离(主要隔离),但您可以 创建额外的隔离,启用并行代码执行 多个处理器核心。
你的问题还没有得到解答,也不会轻易回答,因为这取决于语言的实现。
另外,你的另一个问题:“当我们使用 Future 进行异步编程并让我们看看我们正在其中进行繁重的工作时,如果使用 wait 关键字等待它,这是否会阻塞 UI 线程。”
-> 是的,它会阻塞 UI,除非您使用另一个隔离。
这是 isolates 官方文档所说的。
所有 Dart 代码都在隔离区内运行,而不是线程。使用隔离,您的 Dart 代码可以同时执行多个独立任务,并使用额外的处理器核心(如果可用)。隔离就像线程或进程,但每个隔离都有自己的内存和运行事件循环的单个线程。
当然,我们可以将isolate视为线程或进程。最大的区别是
每个isolate都有自己的内存空间,并且它们通过消息传递相互通信。