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...`
|
actionMsg.value = `Starting: ${immediateCount} immediate, ${queueTotal} queuing...`
|
||||||
|
|
||||||
const tasks = filesToProcess.map((f) => {
|
async function processFile(f: any) {
|
||||||
return limit(async () => {
|
const fileUuid = f.file_uuid
|
||||||
const fileUuid = f.file_uuid
|
if (!fileUuid) {
|
||||||
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++
|
failCount++
|
||||||
|
processing--
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
processing++
|
const result: any = await apiCall('re_scan_file', {
|
||||||
const queueCount = Math.max(0, filesToProcess.length - successCount - failCount - processing)
|
fileUuid: fileUuid,
|
||||||
|
autoPipeline: true
|
||||||
|
})
|
||||||
|
|
||||||
if (queueCount > 0) {
|
if (result.success) {
|
||||||
actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length} (${queueCount} queuing)...`
|
successCount++
|
||||||
|
if (file) {
|
||||||
|
file.status = 'scanning'
|
||||||
|
fileStatusCache.value[fileUuid] = 'scanning'
|
||||||
|
await syncFileStatus(fileUuid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 等待 2 秒,确保后端开始处理并释放资源
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 2000))
|
||||||
} else {
|
} 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++
|
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)
|
await Promise.all(tasks)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user