我有这个最初不支持上下文的当前函数。
func (s *Service) ChunkUpload(r *multipart.Reader) error {
chunk, err := s.parseChunk(r)
if err != nil {
return fmt.Errorf("failed parsing chunk %w", err)
}
if err := os.MkdirAll(chunk.UploadDir, 02750); err != nil {
return err
}
if err := s.saveChunk(chunk); err != nil {
return fmt.Errorf("failed saving chunk %w", err)
}
return nil
}
我已经更新了它的方法调用,现在将 acontext.Context作为它的第一个参数。我的主要目标是在上下文被取消后立即终止并返回函数。
我最初的实现是这样的。
func (s *Service) ChunkUpload(ctx context.Context, r *multipart.Reader) error {
errCh := make(chan error)
go func() {
chunk, err := s.parseChunk(r)
if err != nil {
errCh <- fmt.Errorf("failed parsing chunk %w", err)
return
}
if err := os.MkdirAll(chunk.UploadDir, 02750); err != nil {
errCh <- err
return
}
if err := s.saveChunk(chunk); err != nil {
errCh <- fmt.Errorf("failed saving chunk %w", err)
return
}
}()
select {
case err := <-errCh:
return err
case <-ctx.Done():
return ctx.Err()
}
}
然而,当我想到代码的执行时,我意识到这并没有达到我的目标。由于所有函数的逻辑都在一个单独的 go 例程中,即使上下文被取消并且我ChunkUpload提前返回,go 例程中的代码将继续执行,因此与原始代码没有真正的区别。
下一个虽然可以,只需将上下文传递给所有内部函数,例如s.parseChunk,s.saveChunk但是这个选项似乎也不正确,因为我需要在每个函数中实现取消。将这个原始函数重构为上下文感知并在上下文被取消后立即终止的正确方法是什么?
斯蒂芬大帝
温温酱
相关分类