【问题标题】:Long running tasks in a web serverWeb 服务器中长时间运行的任务
【发布时间】:2019-08-01 09:17:30
【问题描述】:

我正在使用fasthttp 在 Go 中创建一个 HTTP 服务器。当用户访问某条路线时,比如说/foo 我想启动一个运行时间很长的任务(想想10m+),但立即响应请求。这个长时间运行的任务应该继续在后台运行,直到它退出,即使函数返回或用户终止连接。

在 Go 中最好的方法是什么?

据我所知,Goroutines 可能不是正确的东西,因为它们适用于短时间运行的异步代码,还是我错了?

【问题讨论】:

  • @mh-cbon 如果用户在任务完成之前关闭选项卡会发生什么?我理解 goroutine 的概念(我希望如此)。另外,链接坏了
  • 当你启动一个 goroutine 时,它​​会一直持续到 goroutine 函数返回,不管它需要多长时间(假设进程由于某种原因没有退出)。 Go 之旅中关于 goroutines 的部分在这里:tour.golang.org/concurrency/1
  • If the user closes the tab before the task is finished what will happen? 只要您在后台启动工作(goroutine)并立即响应,什么都没有。如果您要在选项卡关闭时停止该进程(即答案中提到的 tcp conn),那将不再是一个非阻塞进程,特别是在 http 中,我们将是长轮询技术,这与您所描述的不同.
  • Goroutines 非常适合这个。唯一的问题是当任务在后台发生时如何处理 HTTP 请求。有很多方法可以做到这一点。
  • 您的 HTTP 服务器本身在 goroutine 中运行,并且可能与您的进程一样长时间运行。 Goroutines 运行只要他们需要,我不知道你去哪里的印象他们是“用于短时间运行的异步代码”。

标签: multithreading go asynchronous server


【解决方案1】:

不:goroutine 可以持续多久(以及主程序):您只需要知道,如mentioned here,何时终止该 goroutine。

在您的情况下,您必须检测到您的连接已被用户终止,如“Close the goroutine reading from a TCP connection without closing connection”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2016-05-23
    • 2017-08-24
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多