这里的 doSomething 可能会因为 http 超时或者各种原因中断,如何让 longTimeTask() 持续运行下去呢?
func doSomething(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "start!\n")
longTimeTask()
}
func longTimeTask() {
...
}
func main() {
http.HandleFunc("/do", doSomething)
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
1
Trim21 2019-08-30 11:01:39 +08:00 via iPhone 1
新开一个 goroutine ?
|
2
blackcurrant OP @Trim21 你是说这样?
func doSomething(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "start!\n") go longTimeTask() } 当 doSomething 退出,函数里面的 goroutine 也退出了。 |
3
lbp0200 2019-08-30 11:39:20 +08:00 1
func longTimeTask() {
go func() { tick := time.Tick(time.Second) for range tick { log.Println("fucker") } }() } 结果: curl 127.0.0.1:12345/do [11:37:17] start! 2019/08/30 11:37:21 fucker 2019/08/30 11:37:22 fucker 2019/08/30 11:37:23 fucker 2019/08/30 11:37:24 fucker 2019/08/30 11:37:25 fucker 2019/08/30 11:37:26 fucker 2019/08/30 11:37:27 fucker 2019/08/30 11:37:28 fucker 2019/08/30 11:37:29 fucker 2019/08/30 11:37:30 fucker 2019/08/30 11:37:31 fucker 2019/08/30 11:37:32 fucker …… |
4
fuxiaohei 2019-08-30 11:57:55 +08:00 1
@blackcurrant 你最好试一下再说
|
5
wkzq 2019-08-30 12:30:19 +08:00 1
建议用 channel 触发 goroutine, 这样子可以通过调节 sigChan 的 size 来控制 goroutine 的数量
func doSomething(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "start!\n") sigChan <- 1 } func goroutine() { for { select { case _ = <- sigChan: go longTimeTask() } } } func longTimeTask() { ... } |
6
blackcurrant OP |
7
zzlettle 2019-08-30 13:21:58 +08:00
意思是函数退出了
协程依然在运行 看来我也对 GO 协程理解不到位 |
8
buried 2019-08-30 13:28:53 +08:00
三楼的回答有声音怎么回事
|
9
zzlettle 2019-08-30 13:31:06 +08:00
这个也解开了我以前的一个提问
当时用时时间定时器 很奇怪,函数推出 然后还显示了协程里面的内容 现在知道了,原来是时间定时器那个协程还能在运行的原因 |
10
labulaka521 2019-08-30 13:37:00 +08:00 via Android
@blackcurrant 不会的 建议看下 go 的调度
|
11
fishofcat 2019-08-30 13:37:46 +08:00
@blackcurrant 你最好试试再说
|
12
vtz668 2019-10-14 20:26:37 +08:00 1
我之前写了一个求素数的,当值特别大时,运行时间要好久,10 几秒把,后来我用 grpc 调用,无论这个值多大,运行一二十秒,结果也会顺利得到,后来我用 http 调用,刚开始我以为我是用微服务 micro 做得,api 负责处理 http 请求,然后再调用 grpc 调用方法求素数,这时候如果超时 5 秒,就会报错,但是 grpc 调用的代码依旧在运行,后来我就搜索英文和中文,因为我不知道是 micro 框架限定超时时间还是注册服务 consul,但是没收到,后来我无意中在那里看到有人回复说,是 http 里面 ctx 会默认 timeout 时间为 5 秒,所以应该是这个问题,因为就算开启一个协程,http 在 5 秒内没有得到结果,也会返回
|