哈Ha!我向您介绍了Didier Boelens关于(特别是)异步和多线程的文章“未来-隔离-事件循环”的翻译。Dart
Flutter
TLDR: , . Event Loop, Future async/await (, JavaScript), otlin, , . , .
以及有关术语的翻译。用口头语言我们 我说的是“信息流”,“交易”,“期货”等,而在印刷中,这些术语显得奇怪而笨拙。
同时,它Stream
是一个流,并且Thread
-一个流。在这种情况下,上下文并不总是保存。就我的口味而言,同一个孤立词在俄语中听起来很正常,因此我在西里尔字母中使用了拼写,而在原始语言中则使用了它。
俄语单词后面的括号中的内容为英文原文,有时反之亦然。
介绍
最近,我经常收到有关的概念问题Future
,async
,await
,Isolate
的代码和并行执行。
此外,一些开发人员在理解其代码执行顺序时遇到问题。
我决定借此机会,专门针对这些问题发表文章。与此同时,我会尽量摆脱主要与概念相关联的混乱
和
。
Dart
-单线程语言
, Dart
— Flutter
Dart
.
Dart
. . , .
, ( ), , .
void myBigLoop(){
for (int i = 0; i < 1000000; i++){
_doSomethingSynchronously();
}
}
, myBigLoop()
. , - ,
, .
Dart
Dart
, , Event Loop
.
Flutter
- ( Dart
-), — Thread
, —
(Isolate
). , .
, :
- (
Queues
) MicroTask
()
Event
(), FIFO
(.: first in first out, .. ,
, ), main()
,Event Loop
( )
,
Event Loop
, : MicroTask
Event
.
Event Loop
"" ,
"". ,
Dart
-, "" :
void eventLoop(){
while (microTaskQueue.isNotEmpty){
fetchFirstMicroTaskFromQueue();
executeThisMicroTask();
return;
}
if (eventQueue.isNotEmpty){
fetchFirstEventFromQueue();
executeThisEventRelatedCode();
}
}
, MicroTask
Event
. ?
MicroTask
,
, - , Event Loop
.
. - , - :
MyResource myResource;
...
void closeAndRelease() {
scheduleMicroTask(_dispose);
_close();
}
void _close(){
// ,
//
...
}
void _dispose(){
// ,
// , _close()
//
}
-, , . ,
scheduleMicroTask()
7 . Event
.
Event
, :
, , Event
.
, MicroTask
, Event Loop
Event
.
, Futures
Event
.
Futures
Future
,
( ) - .
, Future
:
- ,
Dart
- ,
Future
,
Event
Future
(incomplete)- , (
Future
)
, Future
Event
,
Event Loop
.
( ) then()
catchError()
Future
.
, :
void main(){
print('Before the Future');
Future((){
print('Running the Future');
}).then((_){
print('Future is complete');
});
print('After the Future');
}
, :
Before the Future
After the Future
Running the Future
Future is complete
:
print('Before the Future')
(){print('Running the Future');}
Event
print('After the Future')
Event Loop
2- ,
then()
:
Future
, , Event Loop
(async)
async
, Dart
, :
- —
Future
- ,
await
, Future
, await
, await
, [ Future], .
Event Loop
...
,
,
void main() async {
methodA();
await methodB();
await methodC('main');
methodD();
}
methodA(){
print('A');
}
methodB() async {
print('B start');
await methodC('B');
print('B end');
}
methodC(String from) async {
print('C start from $from');
Future((){ // <== -
print('C running Future from $from');
}).then((_){
print('C end of Future from $from');
});
print('C end from $from');
}
methodD(){
print('D');
}
:
A
B start
C start from B
C end from B
B end
C start from main
C end from main
D
C running Future from B
C end of Future from B
C running Future from main
C end of Future from main
, methodC()
. , , .
, methodD()
, :
void main() async {
methodA();
await methodB();
await methodC('main');
methodD();
}
methodA(){
print('A');
}
methodB() async {
print('B start');
await methodC('B');
print('B end');
}
methodC(String from) async {
print('C start from $from');
await Future((){ // <==
print('C running Future from $from');
}).then((_){
print('C end of Future from $from');
});
print('C end from $from');
}
methodD(){
print('D');
}
:
A
B start
C start from B
C running Future from B
C end of Future from B
C end from B
B end
C start from main
C running Future from main
C end of Future from main
C end from main
D
, await
Future
methodC()
.
:
, , Event Loop
. . method1
— method2
? ?
void method1(){
List<String> myArray = <String>['a','b','c'];
print('before loop');
myArray.forEach((String value) async {
await delayedPrint(value);
});
print('end of loop');
}
void method2() async {
List<String> myArray = <String>['a','b','c'];
print('before loop');
for(int i=0; i<myArray.length; i++) {
await delayedPrint(myArray[i]);
}
print('end of loop');
}
Future<void> delayedPrint(String value) async {
await Future.delayed(Duration(seconds: 1));
print('delayedPrint: $value');
}
: .
, method1
forEach()
. , async
( Future
). await
, Event
. , : print('end of loop')
. Event Loop
3 .
method2
, ( ) — .
, ,
Event Loop
...
, Flutter
? ?
, Isolate
().
, Isolate
Dart
Thread
().
Thread
.
Flutter
.
.
Event Loop
.
(MicroTask
Event
).
.
Dart
.
, .
1.
() API, Dart
.
1.1. 1:
,
, , "" ""
.
, ,
. SendPort
( , , /, ).
, "" " " , "". :
//
//
//
//
//
SendPort newIsolateSendPort;
//
//
//
Isolate newIsolate;
//
// ,
//
//
void callerCreateIsolate() async {
//
// ReceivePort
// SendPort
//
ReceivePort receivePort = ReceivePort();
//
//
//
newIsolate = await Isolate.spawn(
callbackFunction,
receivePort.sendPort,
);
//
// ""
//
newIsolateSendPort = await receivePort.first;
}
//
//
//
static void callbackFunction(SendPort callerSendPort){
//
// SendPort
// ""
//
ReceivePort newIsolateReceivePort = ReceivePort();
//
// "" SendPort
//
callerSendPort.send(newIsolateReceivePort.sendPort);
//
//
//
}
:
1.2. 2:
,
, :
//
// ,
//
//
// ""
// String ( )
//
Future<String> sendReceive(String messageToBeSent) async {
//
//
//
ReceivePort port = ReceivePort();
//
// ,
// ,
//
//
newIsolateSendPort.send(
CrossIsolatesMessage<String>(
sender: port.sendPort,
message: messageToBeSent,
)
);
//
//
//
return port.first;
}
//
// Callback-
//
static void callbackFunction(SendPort callerSendPort){
//
// SendPort
//
//
ReceivePort newIsolateReceivePort = ReceivePort();
//
// "" SendPort
//
callerSendPort.send(newIsolateReceivePort.sendPort);
//
// , ,
//
//
newIsolateReceivePort.listen((dynamic message){
CrossIsolatesMessage incomingMessage = message as CrossIsolatesMessage;
//
//
//
String newMessage = "complemented string " + incomingMessage.message;
//
//
//
incomingMessage.sender.send(newMessage);
});
}
//
//
//
class CrossIsolatesMessage<T> {
final SendPort sender;
final T message;
CrossIsolatesMessage({
@required this.sender,
this.message,
});
}
1.3. 3:
, :
void dispose(){
newIsolate?.kill(priority: Isolate.immediate);
newIsolate = null;
}
1.4. — Stream
, ""
"" (Streams). Single-Listener Stream
( ).
2. (One-shot computation)
,
, Dart
compute
,
: ( ).
3.
, ,
(Platform-Channel communication)
(main isolate).
, .
,
,
.
Future
, :
, (user experiences lags), .
, :
- ,
( ) - ,
, — Event Loop
Futures
- ,
, —
, , , Futures
( async
-) — Futures
Event Loop
"" . , ( - , ).
, Future
— , .
:
- JSON, (HttpRequest),
=> compute
- : =>
- ( ..) =>
- :
, , .
, , Event Loop
.
同样重要的是不要忘记Flutter
(Dart
)是单线程的,因此,为了满足用户的需要,开发人员必须确保应用程序将尽可能平稳地运行。Futures
和
-功能强大的工具来帮助实现这一目标。
祝好运