From d1374eca152cbcdcf12c5a922e00b5c68c576be3 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 8 Feb 2023 19:23:18 +0800 Subject: [PATCH] Limit concurrency instead of parallelism --- .../com/hippo/ehviewer/spider/SpiderQueenWorker.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt index bdca4331b..d77dfd1d9 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt @@ -25,6 +25,8 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withPermit import kotlin.coroutines.CoroutineContext class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { @@ -32,7 +34,7 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { get() = queen.mSpiderDen private val spiderInfo by lazy { queen.mSpiderInfo.get() } private val mJobMap = hashMapOf() - private val maxParallelismSize = Settings.getMultiThreadDownload().coerceIn(1, 10) + private val mSemaphore = Semaphore(Settings.getMultiThreadDownload().coerceIn(1, 10)) private val pTokenLock = Any() private var showKey: String? = null private val showKeyLock = Any() @@ -41,7 +43,7 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { private val size get() = queen.size() override val coroutineContext: CoroutineContext - get() = Dispatchers.IO.limitedParallelism(maxParallelismSize) + SupervisorJob() + get() = Dispatchers.IO + SupervisorJob() fun cancel(index: Int) { synchronized(mJobMap) { @@ -85,7 +87,11 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { val currentJob = mJobMap[index] if (force) currentJob?.cancel() if (currentJob?.isActive != true) { - mJobMap[index] = launch { doInJob(index, force) } + mJobMap[index] = launch { + mSemaphore.withPermit { + doInJob(index, force) + } + } } } }