From 83b7d31e0a0a35dee03e84b62cbf472872074252 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:48:23 +0100 Subject: [PATCH] Increase isolate pool size to enhance concurrent download capabilities --- lib/main.dart | 4 +-- .../download_isolate_pool.dart | 27 ++++++++++++++----- .../download_manager/m_downloader.dart | 3 ++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 751c6f25..5fc03917 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -84,9 +84,7 @@ void main(List args) async { Future _postLaunchInit(StorageProvider storage) async { await AppLogger.init(); - // Initialiser le pool d'Isolates partagé (3 workers) - // Optimise la mémoire pour 50+ téléchargements simultanés - unawaited(MDownloader.initializeIsolatePool(poolSize: 3)); + unawaited(MDownloader.initializeIsolatePool(poolSize: 6)); final hivePath = (Platform.isIOS || Platform.isMacOS) ? "databases" : p.join("Mangayomi", "databases"); diff --git a/lib/services/download_manager/download_isolate_pool.dart b/lib/services/download_manager/download_isolate_pool.dart index 27ac9c1a..4c57da76 100644 --- a/lib/services/download_manager/download_isolate_pool.dart +++ b/lib/services/download_manager/download_isolate_pool.dart @@ -24,9 +24,9 @@ class DownloadIsolatePool { static DownloadIsolatePool? _instance; final List<_PoolWorker> _workers = []; final Queue<_DownloadTask> _taskQueue = Queue(); + final Set _availableWorkers = {}; // Track available workers by index final int poolSize; bool _initialized = false; - int _activeWorkers = 0; DownloadIsolatePool._({this.poolSize = 3}); @@ -58,6 +58,7 @@ class DownloadIsolatePool { for (int i = 0; i < poolSize; i++) { final worker = await _PoolWorker.create(i); _workers.add(worker); + _availableWorkers.add(i); // All workers start as available } _initialized = true; @@ -187,13 +188,25 @@ class DownloadIsolatePool { /// Process the task queue void _processQueue() { - while (_taskQueue.isNotEmpty && _activeWorkers < _workers.length) { + while (_taskQueue.isNotEmpty && _availableWorkers.isNotEmpty) { final task = _taskQueue.removeFirst(); - final worker = _workers[_activeWorkers]; - _activeWorkers++; + final workerIndex = _availableWorkers.first; + _availableWorkers.remove(workerIndex); + final worker = _workers[workerIndex]; + + if (kDebugMode) { + print( + '[DownloadPool] Worker $workerIndex starting task ${task.taskId}', + ); + } worker.executeTask(task).then((_) { - _activeWorkers--; + _availableWorkers.add(workerIndex); // Worker is free again + if (kDebugMode) { + print( + '[DownloadPool] Worker $workerIndex finished task ${task.taskId}, available workers: ${_availableWorkers.length}', + ); + } _processQueue(); // Process the next task }); } @@ -203,7 +216,7 @@ class DownloadIsolatePool { int get pendingTasks => _taskQueue.length; /// Number of active workers - int get activeWorkers => _activeWorkers; + int get activeWorkers => poolSize - _availableWorkers.length; /// Close the pool void dispose() { @@ -212,9 +225,9 @@ class DownloadIsolatePool { } _workers.clear(); _taskQueue.clear(); + _availableWorkers.clear(); downloadTaskCancellation.clear(); _initialized = false; - _activeWorkers = 0; } } diff --git a/lib/services/download_manager/m_downloader.dart b/lib/services/download_manager/m_downloader.dart index 05642c78..39949806 100644 --- a/lib/services/download_manager/m_downloader.dart +++ b/lib/services/download_manager/m_downloader.dart @@ -43,7 +43,8 @@ class MDownloader { } /// Initialize the Isolate pool (call once at app startup) - static Future initializeIsolatePool({int poolSize = 3}) async { + /// poolSize = 6 workers allows 6 chapters to download in parallel + static Future initializeIsolatePool({int poolSize = 6}) async { DownloadIsolatePool.configure(poolSize: poolSize); await DownloadIsolatePool.instance.initialize(); }