Dart是通过单线程多进程的方式实现异步非阻塞的吗?

好吧,我自己找到答案了.

Dart中的Isaolate就是使用特定操作系统中的Thread实现的,DartVM对其进行了封装. 所以不存在单线程多进程.

相关源码 github.c0m/dart-lang/sdk/blob/master/runtime/vm/os_thread.h

// Declare the OS-specific types ahead of defining the generic classes. 
#if defined(HOST_OS_ANDROID) #include "vm/os_thread_android.h" 
#elif defined(HOST_OS_FUCHSIA) #include "vm/os_thread_fuchsia.h" 
#elif defined(HOST_OS_LINUX) #include "vm/os_thread_linux.h" 
#elif defined(HOST_OS_MACOS) #include "vm/os_thread_macos.h" 
#elif defined(HOST_OS_WINDOWS) #include "vm/os_thread_win.h"

原问题:
Dart的官网告诉我们:Dart的程序运行在单线程中的。

Dart code runs in a single “thread” of execution.

然后在这篇文章中提到了这一点:Dart应用会在一个新的线程进程启动。

When you start a Flutter (or any Dart ) application, a new Thread process (in Dart language = “ Isolate ”) is created and launched .

操作系统内核对CPU调度只提供了进程的抽象,虽然操作系统提供了一些实现了线程模型的库。
isolate的特性之一也是不共享内存, 是不是说明 Dart是通过单线程多进程实现异步非阻塞的呢?
每创建一个isolate就会fork一个进程?

还有个小问题,我在尝试了解future实现的时候走到这就不知道怎么继续了。

new Future((){})
Timer.run()
Zone.current.createTimer(duration, Zone.current.bindCallbackGuarded(callback))

最后通过IDEA定位到这个方法

external static Timer _createTimer(Duration duration, void callback());

这种 external static 的方法如何找到方法实现呢?
为啥TimerZone并没有实现关系,为啥Timer中调用了ZonecreateTimer,而最终实现却是Timer的这个external static Timer _createTimer() 方法。

1赞

你好,感谢分享。

据我了解,dart 需要支持vm跟js环境,而 external 就用来表明方法的实现不在此处,需要到相应的运行环境下去找,比如 Timer._createTimer 就在runtime/js_runtime/js_dev_runtime下有多个实现:https://github.com/dart-lang/sdk/search?q=_createTimer&unscoped_q=_createTimer

1赞

:laughing: 也非常感谢你的分享.
我明白了,external static类似于Java中的native,用于调用外部动态库导出的函数.