【问题标题】:Process XMLFile out of request处理超出请求的 XMLFile
【发布时间】:2018-06-05 10:33:06
【问题描述】:

我在 GoLang(使用 gorillamux)中创建了一个 REST API,并且在来自我的 API 的一个请求中,我处理了一个 XMLFile。问题是,这个文件很大,5、6、10 MB。我无法处理 postfile 请求,因为处理时间。 xml 的每个节点都是对另一个 API 的 http 请求(非常有时间)。

问题是。

在GoLang中,它可能接收请求,返回响应(200),并处理请求外的文件?

【问题讨论】:

  • 我的意思是......有点难以理解你在做什么......但听起来你想要处理 xml 而不是保留响应。发送要处理的 xml 数据,将其排队等待稍后处理,但需要一些子进程。
  • 你总是可以只启动一个 goroutine。它们在the Go tour 中被覆盖。

标签: go request gorilla


【解决方案1】:

在GoLang中,它可能接收请求,返回响应(200),并处理请求外的文件?

当然。您可以使用 goroutine:

func myHandler(w http.ResponseWriter, r *http.Request) {
    go func() {
        // Process the stuff in a goroutine
    }()
    w.WriteHeader(200) // but send the response immediately
}

【讨论】:

    【解决方案2】:

    是的。 Go 为它提供了非常方便的工具。完成此任务的经典方法之一是创建一个用作任务队列的通道。您的 API 函数将写入通道新任务,另一个工作 goroutine 将读取并处理它们:

    type Task struct {...} // some fields to describe you task - may be XML document 
    var TaskQueue chan Task
    
    func worker() {
          for task := range TaskQueue {
                 // process task 
           }
    }
    
    func handler(w http.ResponseWriter, r*http.Request) {
        task := Task{...} // put here some values you need 
        TaskQueue <- task
        w.WriteHeader(200)
    }
    
    
    func main() {
        TaskQueue = make(chan Task, 1)
         go worker()
         http.Handle("/", handler)
         http.ListenAndServe(":8080", nil)
    }
    

    这种方式给你一些灵活性:

    • 您可以运行多个 worker 来并行处理任务,并且您可以确定不会有更多的 worker,因此可以控制服务器的负载
    • 如果所有工作人员都忙,可以将新任务放入队列 - make 的第二个参数设置队列长度
    • 如果队列超载,您可以在handler 中检查它并返回错误(此处未显示)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2017-09-03
      • 2011-07-11
      • 2018-02-11
      • 2021-08-28
      • 2012-10-30
      相关资源
      最近更新 更多