fix: 添加延迟确保批量 Deep Scan 严格限制并发为 2
问题: - re_scan_file API 是异步的,立即返回成功 - 后端可能同时启动多个扫描任务 - 导致有 4 个文件同时在 scanning 状态 临时修复: - 在每个文件启动扫描后等待 2 秒 - 确保后端有足够时间开始处理并释放资源 - 保持前端并发控制为 2,避免过多任务同时启动 未来改进: - 需要在后端实现真正的队列机制 - 或者检查当前 scanning 状态,动态调整启动速度
This commit is contained in:
@@ -1899,54 +1899,57 @@ async function batchDeepScan() {
|
||||
|
||||
actionMsg.value = `Starting: ${immediateCount} immediate, ${queueTotal} queuing...`
|
||||
|
||||
const tasks = filesToProcess.map((f) => {
|
||||
return limit(async () => {
|
||||
const fileUuid = f.file_uuid
|
||||
if (!fileUuid) {
|
||||
async function processFile(f: any) {
|
||||
const fileUuid = f.file_uuid
|
||||
if (!fileUuid) {
|
||||
failCount++
|
||||
return
|
||||
}
|
||||
|
||||
processing++
|
||||
const queueCount = Math.max(0, filesToProcess.length - successCount - failCount - processing)
|
||||
|
||||
if (queueCount > 0) {
|
||||
actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length} (${queueCount} queuing)...`
|
||||
} else {
|
||||
actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length}...`
|
||||
}
|
||||
|
||||
try {
|
||||
const file = filesCache.value.find((x: any) => x.file_uuid === fileUuid)
|
||||
if (!file) {
|
||||
failCount++
|
||||
processing--
|
||||
return
|
||||
}
|
||||
|
||||
processing++
|
||||
const queueCount = Math.max(0, filesToProcess.length - successCount - failCount - processing)
|
||||
const result: any = await apiCall('re_scan_file', {
|
||||
fileUuid: fileUuid,
|
||||
autoPipeline: true
|
||||
})
|
||||
|
||||
if (queueCount > 0) {
|
||||
actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length} (${queueCount} queuing)...`
|
||||
if (result.success) {
|
||||
successCount++
|
||||
if (file) {
|
||||
file.status = 'scanning'
|
||||
fileStatusCache.value[fileUuid] = 'scanning'
|
||||
await syncFileStatus(fileUuid)
|
||||
}
|
||||
|
||||
// 等待 2 秒,确保后端开始处理并释放资源
|
||||
await new Promise(resolve => setTimeout(resolve, 2000))
|
||||
} else {
|
||||
actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length}...`
|
||||
}
|
||||
|
||||
try {
|
||||
const file = filesCache.value.find((x: any) => x.file_uuid === fileUuid)
|
||||
if (!file) {
|
||||
failCount++
|
||||
processing--
|
||||
return
|
||||
}
|
||||
|
||||
const result: any = await apiCall('re_scan_file', {
|
||||
fileUuid: fileUuid,
|
||||
autoPipeline: true
|
||||
})
|
||||
|
||||
if (result.success) {
|
||||
successCount++
|
||||
if (file) {
|
||||
file.status = 'scanning'
|
||||
fileStatusCache.value[fileUuid] = 'scanning'
|
||||
await syncFileStatus(fileUuid)
|
||||
}
|
||||
} else {
|
||||
failCount++
|
||||
}
|
||||
} catch (e: any) {
|
||||
failCount++
|
||||
console.error('[batchDeepScan] Failed:', f.file_name, e)
|
||||
} finally {
|
||||
processing--
|
||||
}
|
||||
})
|
||||
})
|
||||
} catch (e: any) {
|
||||
failCount++
|
||||
console.error('[batchDeepScan] Failed:', f.file_name, e)
|
||||
} finally {
|
||||
processing--
|
||||
}
|
||||
}
|
||||
|
||||
const tasks = filesToProcess.map((f) => limit(() => processFile(f)))
|
||||
|
||||
await Promise.all(tasks)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user