【发布时间】: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