всем привет, у меня небольшая тулза на Dart, она делает сводку по CSV с температурами, и я запускаю по одному изоляту на файл, чтобы большие не ждали друг друга. запускаю в WSL так:
dart run bin/summarize.dart data/north.csv data/south.csv -v
с -v вижу две строки "spawned worker", потом две строки "got ... rows", и количество строк правильное. то есть воркеры явно работают. но потом ничего. ни таблицы, ни возврата в консоль, приходится жать Ctrl+C.
сначала я думал, что readAsLinesSync в воркере что-то блокирует, потом обернул тело воркера в try/catch, но ничего не бросается и ничего не меняется.
что меня смущает: я помню, что цикл в main сам заканчивался, когда все запущенные изоляты завершались. поэтому я и использую await for, а не считаю результаты. вот основная часть:
final port = ReceivePort();
for (final p in paths) {
await Isolate.spawn(summarizeFile, WorkOrder(p, port.sendPort));
log.debug('spawned worker for $p');
}
final results = <FileSummary>[];
await for (final msg in port) {
final s = msg as FileSummary;
results.add(s);
log.info('got ${s.path}: ${s.count} rows');
}
results.sort((a, b) => a.path.compareTo(b.path));
printTable(results);
воркер в конце просто делает order.replyTo.send(FileSummary(...)) и возвращается. Dart 3.x, свежий. что-то поменялось в том, когда этот цикл заканчивается? не хочу переписывать сбор результатов, пока не пойму, в чём дело.
Переведено с английского·Показать оригиналhi all, small dart tool here, it summarises temperature CSVs and I spawn one isolate per file so the big ones don't wait for each other. i run it in WSL like this:
dart run bin/summarize.dart data/north.csv data/south.csv -v
with -v i see the two "spawned worker" lines and then two "got ... rows" lines, and the row counts are right. so the workers clearly do their work. but then nothing. no table, no prompt back, i have to Ctrl+C.
first i thought the readAsLinesSync in the worker was blocking something, then i wrapped the worker body in try/catch, but nothing is thrown and nothing changes.
what confuses me is that i remember the loop in main ending by itself once all the spawned isolates were finished. that's why i'm using await for and not counting results. this is the main part:
final port = ReceivePort();
for (final p in paths) {
await Isolate.spawn(summarizeFile, WorkOrder(p, port.sendPort));
log.debug('spawned worker for $p');
}
final results = <FileSummary>[];
await for (final msg in port) {
final s = msg as FileSummary;
results.add(s);
log.info('got ${s.path}: ${s.count} rows');
}
results.sort((a, b) => a.path.compareTo(b.path));
printTable(results);
worker just does order.replyTo.send(FileSummary(...)) at the end and returns. recent Dart 3.x. did something change about when that loop ends? i don't want to rewrite the collecting part before i understand this.