From 987f0236a95d340688efe5a49202c25ab948587a Mon Sep 17 00:00:00 2001 From: YGXB_net Date: Mon, 27 Apr 2026 13:38:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(uploader):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD=E7=9A=84=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E7=AE=A1=E7=90=86=E5=92=8C=E5=B9=B6=E5=8F=91=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 UploadDataToServer 函数中添加 context 参数支持 - 使用 http.NewRequest 替换 httpClient.Post 以更好地控制请求上下文 - 重构应用启动逻辑,在 StartUpload 中初始化上传器上下文 - 优化 StopUpload 方法中的上下文取消机制 - 移除上传过程中的 wg.Wait() 调用以改善并发性能 --- app.go | 2 +- internal/api/api.go | 15 ++++++++++++--- internal/uploader/uploader.go | 3 +-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app.go b/app.go index fa89bc5..67803c6 100644 --- a/app.go +++ b/app.go @@ -65,12 +65,12 @@ func (a *App) StartUpload() { if isRun { return } + a.uploaderCTX, a.uploaderCancel = context.WithCancel(a.ctx) go uploader.StartLooking(a.uploaderCTX, &a.logChan, config.APPConfig.CheckDir) } func (a *App) StopUpload() { if isRun { a.uploaderCancel() - a.uploaderCTX, a.uploaderCancel = context.WithCancel(a.ctx) } } diff --git a/internal/api/api.go b/internal/api/api.go index 5371a72..b01c4bb 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -1,6 +1,7 @@ package api import ( + "context" "dypid-client/internal/config" "io" "net/http" @@ -17,18 +18,26 @@ var httpClient = &http.Client{ Timeout: 30 * time.Second, } -func UploadDataToServer(data string) error { +func UploadDataToServer(ctx context.Context, data string) error { params := url.Values{} params.Set("token", config.APPConfig.Token) params.Set("data", data) //http://127.0.0.1:8080/api/data?token=123456&data=123456 - resp, err := httpClient.Post(config.APPConfig.Url+"/api/data?"+params.Encode(), - "", nil, + request, err := http.NewRequest( + "POST", + config.APPConfig.Url+"/api/data?"+params.Encode(), + nil, ) if err != nil { return err } + request.WithContext(ctx) + + resp, err := httpClient.Do(request) + if err != nil { + return err + } if resp != nil { _, _ = io.Copy(io.Discard, resp.Body) resp.Body.Close() diff --git a/internal/uploader/uploader.go b/internal/uploader/uploader.go index 5ecf0b5..90d544c 100644 --- a/internal/uploader/uploader.go +++ b/internal/uploader/uploader.go @@ -211,7 +211,6 @@ func processFile(ctx context.Context, logChan *chan string, filePath string, fil select { case <-ctx.Done(): close(lines) - wg.Wait() return default: progress.Store(filepath.Base(filePath), @@ -245,7 +244,7 @@ func processLines(ctx context.Context, logChan *chan string, lines *chan string, continue } // 上传数据 - if err := api.UploadDataToServer(line); err != nil { + if err := api.UploadDataToServer(ctx, line); err != nil { AddLog(logChan, fmt.Sprintf("Worker %d (文件 %s): 上传失败: %v", workerID, filePath, err)) } atomic.AddInt32(countLine, 1)