IsolateManager 리펙토링

This commit is contained in:
leedongmyung[desktop] 2023-10-29 20:01:50 +09:00
parent 2b6510f0a5
commit 96eb818499

View file

@ -1,26 +1,35 @@
import 'dart:io';
import 'dart:isolate';
import 'dart:async';
import 'package:dart_framework/data/isolate_data.dart';
import 'package:dart_framework/platform/process.dart';
/// ********************** Test ************************* ///
void test() {
var initData = {"param0": "value0"};
IsolateManager.create<IsolateTemplate>(IsolateTemplate(), initData,
var id = IsolateManager.create<IsolateTemplate>(IsolateTemplate(), initData,
(isoEvent, data) async {
print('[Manager] On Event from Isolate: ${isoEvent.name}');
if (isoEvent == IsolateEvent.ready) {
int id = data as int;
IsolateManager.sendBroadcast(IsoMessege('test1'));
IsolateManager.sendBroadcast(IsoMessege('test1', message: 'initData1'));
await Future.delayed(Duration(seconds: 2));
IsolateManager.send(id, IsoMessege('test2'));
IsolateManager.send(id, IsoMessege('test1'));
IsolateManager.send(id, IsoMessege('test2', message: 'data2'));
//will not arrive, addListener once
IsolateManager.send(id, IsoMessege('test1', message: 'data1'));
await Future.delayed(Duration(seconds: 7));
IsolateManager.exit(id);
} else if (isoEvent == IsolateEvent.exit) {
print('Isolate is exited.');
print('[Manager] Isolate is exited.');
}
print('On Event from Isolate: ${isoEvent.name}');
}, (message) {
print('On Message from Isolate: ${message.type}');
//Custom message
print('[Manager] On Message from Isolate: ${message.type}');
});
}
@ -32,8 +41,16 @@ class IsolateTemplate extends IsolateBase {
addEventListener('test2', onTest2Handler);
}
void onTest1Handler(Object? data) {
void onTest1Handler(Object? data) async {
print('[IsolateTemplate] OnTest1Handler: $data');
var path = Platform.isWindows ? '%path%' : '\$path';
ProcessExecutor.run(StringBuffer('echo $path'));
await delayTest();
}
Future delayTest() async {
await Future.delayed(Duration(seconds: 5));
send(IsoMessege('delayedCutomMessage', message: 'This is message'));
}
void onTest2Handler(Object? data) {
@ -57,10 +74,10 @@ class _IsolateConstructData {
class IsolateManager {
IsolateManager._privateConstructor();
static final IsolateManager _instance = IsolateManager._privateConstructor();
static IsolateManager get to => _instance;
static IsolateManager get instance => _instance;
int _nonce = 0;
int get nonce {
static int _nonce = 0;
static int get nonce {
if (_nonce == double.maxFinite.toInt()) {
_nonce = 0;
} else {
@ -77,16 +94,18 @@ class IsolateManager {
Object? initData,
Function(IsolateEvent, Object?) isolateEventListener,
Function(IsoMessege) messageListener) async {
to._create<T>(inst, initData, isolateEventListener, messageListener);
var id = nonce;
instance._create<T>(
inst, initData, id, isolateEventListener, messageListener);
}
void _create<T extends IsolateBase>(
T inst,
Object? initData,
int id,
Function(IsolateEvent, Object?) isolateEventListener,
Function(IsoMessege) messageListener) async {
final isoListener = ReceivePort();
var id = nonce;
inst.id = id;
_isoMap[id] = inst;
_addInnerEvent(id, _IsolateInnerEvent.ready, (message) {
@ -127,21 +146,21 @@ class IsolateManager {
}
static void sendBroadcast(IsoMessege message) {
var entries = to._isoMap.entries;
var entries = instance._isoMap.entries;
for (var entry in entries) {
entry.value.insertEvent(message);
}
}
static void send(int id, IsoMessege message) {
var map = to._isoMap;
var map = instance._isoMap;
if (map.containsKey(id)) {
map[id]?.insertEvent(message);
}
}
static void exit(int id) {
var map = to._isoMap;
var map = instance._isoMap;
if (map.containsKey(id)) {
map[id]!.insertEvent(IsoMessege(_IsolateInnerEvent.exit));
}