-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdart_server_isolate_await.dart
51 lines (40 loc) · 1.17 KB
/
dart_server_isolate_await.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import 'dart:io';
import 'dart:isolate';
import 'dto.dart';
Future main() async {
var server = await HttpServer.bind(
InternetAddress.loopbackIPv4,
4040,
);
final cpuCores = Platform.numberOfProcessors;
final isolatePorts = List<SendPort>(cpuCores);
var roundRobin = -1;
for (var i = 0; i < cpuCores; i++) {
final receivePort = ReceivePort();
await Isolate.spawn(
handler, IsolateData(receivePort.sendPort, 'isolate $i'));
isolatePorts[i] = await receivePort.first;
}
print('Listening on localhost:${server.port}');
await for (HttpRequest request in server) {
roundRobin = (roundRobin + 1) % cpuCores;
final msg = await send(isolatePorts[roundRobin], 'req');
request.response.write(msg);
await request.response.close();
}
}
Future send(SendPort port, msg) {
final response = ReceivePort();
port.send([msg, response.sendPort]);
return response.first;
}
Future<void> handler(IsolateData isolateData) async {
final port = ReceivePort();
isolateData.port.send(port.sendPort);
await for (var msg in port) {
final request = msg[0];
SendPort replyTo = msg[1];
fib(35);
replyTo.send('Hello Dart!');
}
}