feat: 断点续传与色情识别提速/修复,支持 Linux 交叉编译
- feat: 新增续传表 scan_log,重扫跳过已归类文件(尺寸/头尾指纹校验) - fix: 色情识别记录批量入库超 SQLite 999 变量上限,改每 100 条一批 - perf: NudeNet 检测改为多线程推理池(每线程独立模型实例) - perf: 明暗分析 JPEG(YCbCr) 快路径;SQLite 读并发放开;加阶段耗时统计 - fix: 前端色情识别状态由后端如实上报(配置开关+检测服务是否起来) - feat: ffprobe 内嵌按平台拆分,Linux 构建回退系统 ffprobe,支持交叉编译 - docs: README 补充断点续传与 CentOS 交叉编译步骤 - chore: organize.workers 默认 8
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package nsfw
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 1x1 透明 PNG,当测试图片用(NudeNet 会自己缩放)。
|
||||
const testPNG = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="
|
||||
|
||||
// TestDetectRestart 验证:python 检测服务中途崩溃后,Detect 会自动重启并恢复正常。
|
||||
func TestDetectRestart(t *testing.T) {
|
||||
py := resolvePython("")
|
||||
if py == "" {
|
||||
t.Skip("无 python")
|
||||
}
|
||||
img := filepath.Join(t.TempDir(), "test.png")
|
||||
if data, err := base64.StdEncoding.DecodeString(testPNG); err != nil {
|
||||
t.Fatalf("解码测试图片失败: %v", err)
|
||||
} else if err := os.WriteFile(img, data, 0644); err != nil {
|
||||
t.Fatalf("写测试图片失败: %v", err)
|
||||
}
|
||||
|
||||
d, err := Start(py, 0.5)
|
||||
if err != nil {
|
||||
t.Fatalf("Start: %v", err)
|
||||
}
|
||||
defer d.Stop()
|
||||
|
||||
if _, _, err := d.Detect(img); err != nil {
|
||||
t.Fatalf("崩溃前检测失败: %v", err)
|
||||
}
|
||||
|
||||
// 直接杀掉 python 进程,模拟处理某张图时崩溃
|
||||
if d.cmd != nil && d.cmd.Process != nil {
|
||||
_ = d.cmd.Process.Kill()
|
||||
}
|
||||
time.Sleep(2 * time.Second) // 等进程退出、端口释放
|
||||
|
||||
if _, _, err := d.Detect(img); err != nil {
|
||||
t.Fatalf("崩溃后检测失败(应自动重启): %v", err)
|
||||
}
|
||||
t.Log("重启后检测成功")
|
||||
}
|
||||
Reference in New Issue
Block a user