always use at-least 5 isolates

This commit is contained in:
shenlong-tanwen 2025-10-01 04:15:47 +05:30
parent e9616a3fbc
commit 425eb2c66e
4 changed files with 12 additions and 9 deletions

View file

@ -35,7 +35,6 @@ import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:immich_mobile/wm_executor.dart'; import 'package:immich_mobile/wm_executor.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:worker_manager/worker_manager.dart';
class BackgroundWorkerFgService { class BackgroundWorkerFgService {
final BackgroundWorkerFgHostApi _foregroundHostApi; final BackgroundWorkerFgHostApi _foregroundHostApi;
@ -94,7 +93,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
await Future.wait( await Future.wait(
[ [
loadTranslations(), loadTranslations(),
workerManagerForIos.init(dynamicSpawning: true), workerManagerPatch.init(dynamicSpawning: true),
_ref?.read(authServiceProvider).setOpenApiServiceEndpoint(), _ref?.read(authServiceProvider).setOpenApiServiceEndpoint(),
// Initialize the file downloader // Initialize the file downloader
FileDownloader().configure( FileDownloader().configure(
@ -199,7 +198,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
_cancellationToken.cancel(); _cancellationToken.cancel();
_logger.info("Cleaning up background worker"); _logger.info("Cleaning up background worker");
final cleanupFutures = [ final cleanupFutures = [
workerManagerForIos.dispose().catchError((_) async { workerManagerPatch.dispose().catchError((_) async {
// Discard any errors on the dispose call // Discard any errors on the dispose call
return; return;
}), }),

View file

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
@ -38,10 +39,10 @@ import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:immich_mobile/utils/licenses.dart'; import 'package:immich_mobile/utils/licenses.dart';
import 'package:immich_mobile/utils/migration.dart'; import 'package:immich_mobile/utils/migration.dart';
import 'package:immich_mobile/wm_executor.dart';
import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:timezone/data/latest.dart'; import 'package:timezone/data/latest.dart';
import 'package:immich_mobile/wm_executor.dart';
void main() async { void main() async {
ImmichWidgetsBinding(); ImmichWidgetsBinding();
@ -50,7 +51,7 @@ void main() async {
await Bootstrap.initDomain(isar, drift, logDb); await Bootstrap.initDomain(isar, drift, logDb);
await initApp(); await initApp();
// Warm-up isolate pool for worker manager // Warm-up isolate pool for worker manager
await workerManagerForIos.init(dynamicSpawning: true, isolatesCount: 6); await workerManagerPatch.init(dynamicSpawning: true, isolatesCount: max(Platform.numberOfProcessors - 1, 5));
await migrateDatabaseIfNeeded(isar, drift); await migrateDatabaseIfNeeded(isar, drift);
HttpSSLOptions.apply(); HttpSSLOptions.apply();

View file

@ -32,7 +32,7 @@ Cancelable<T?> runInIsolateGentle<T>({
throw const InvalidIsolateUsageException(); throw const InvalidIsolateUsageException();
} }
return workerManagerForIos.executeGentle((cancelledChecker) async { return workerManagerPatch.executeGentle((cancelledChecker) async {
T? result; T? result;
await runZonedGuarded( await runZonedGuarded(
() async { () async {

View file

@ -1,13 +1,16 @@
// part of 'package:worker_manager/worker_manager.dart'; // part of 'package:worker_manager/worker_manager.dart';
// ignore_for_file: implementation_imports, avoid_print
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:worker_manager/worker_manager.dart'; import 'package:worker_manager/src/number_of_processors/processors_io.dart';
import 'package:worker_manager/src/worker/worker.dart'; import 'package:worker_manager/src/worker/worker.dart';
import 'package:worker_manager/worker_manager.dart';
final workerManagerForIos = _Executor(); final workerManagerPatch = _Executor();
// [-2^54; 2^53] is compatible with dart2js, see core.int doc // [-2^54; 2^53] is compatible with dart2js, see core.int doc
const _minId = -9007199254740992; const _minId = -9007199254740992;
@ -49,7 +52,7 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
final _pool = <Worker>[]; final _pool = <Worker>[];
var _nextTaskId = _minId; var _nextTaskId = _minId;
var _dynamicSpawning = false; var _dynamicSpawning = false;
var _isolatesCount = 5; var _isolatesCount = numberOfProcessors;
@override @override
Future<void> init({int? isolatesCount, bool? dynamicSpawning}) async { Future<void> init({int? isolatesCount, bool? dynamicSpawning}) async {