GO 如何实现 页面非阻塞?

2018-06-20 16:27:27 +08:00
 lauix
如题

页面非阻塞,就是一个页面访问要 5 秒,10 人访问不排队,并发进行。

Nodejs 自带,Python tornado gevent 都可以实现。

今天研究 golang 发现找不到如何实现。。。

研究了 channel 还是不行

问问 v2 的大神们,有解决方法吗? or 是否有 go web 的高性能解决方案。

基于 web 框架 iris 开发研究测试。
7625 次点击
所在节点    程序员
66 条回复
flyingnn
2018-06-20 17:34:08 +08:00
@mkeith 我的是 WIN10:Microsoft Windows [版本 10.0.16299.431]
dishonest
2018-06-20 17:34:13 +08:00
@march1993 哈。。。
march1993
2018-06-20 17:36:08 +08:00
@dishonest 右下角的 chrome 的 URL 是错的……
LT
2018-06-20 17:36:32 +08:00
func test(ctx context.Context) {
c := make(chan int)
fmt.Println("start")
go func(){
// 等待 10 秒
time.Sleep(time.Duration(5) * time.Second)
c <- 0
}()
<- c
fmt.Println("end")
ctx.Text("test")
}
LT
2018-06-20 17:37:31 +08:00
@dishonest 看这个 issue 解释 kataras/iris/issues/463 然后,测试下 上一条回复的代码
march1993
2018-06-20 17:39:22 +08:00
@dishonest 啊 我 sb 了…没问题
lauix
2018-06-20 17:43:20 +08:00
@LT 用 go func 那是异步了,我想要返回异步里的内容 怎么办?

@flyingnn 你为什么可以?
@march1993 浏览器的推荐,URL 是对的
@dishonest 应该和框架没关系吧,我有空去试试 gin

@LT 看了你第二个回复,这样执行没有问题,可以取到数据,但是还是阻塞的。我都试过了,没有办法才来 V2 发帖了。
LT
2018-06-20 17:45:54 +08:00
没有阻塞额。。。直接在 go func 外层定义变量, 里层接收值就可以了,
lauix
2018-06-20 17:53:01 +08:00
@LT 我复制你的代码是阻塞的,我的系统 MAC 应该和系统没有关系。你怎么调试的?
myyou
2018-06-20 18:07:40 +08:00
我用 gin 框架,和楼主一样方式测试,没有楼主这个问题

![code]( )
![log]( )

是不是 iris 框架有问题?
janxin
2018-06-20 18:17:10 +08:00
破案了,lz 你第二个浏览器网址打错了
aisk
2018-06-20 18:25:41 +08:00
是不是用的比较老的 GO 版本?
AlphaTr
2018-06-20 18:34:09 +08:00
测试了 gen,echo 和 iris 三个框架,都复现了楼主的问题,go version go1.10.2 darwin/amd64

iris:





echo:





gen:



ZSeptember
2018-06-20 18:41:01 +08:00
别用浏览器,用 curl 就不会这样了。
ZSeptember
2018-06-20 18:42:07 +08:00
gamexg
2018-06-20 18:44:37 +08:00
可以复现,甚至标准库 http 实现也可以复现。

```

package main

import (
"fmt"
"net/http"
"time"
)

func handler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")

fmt.Println("start")
time.Sleep(10 * time.Second)
fmt.Println("end")
}

func main() {

http.HandleFunc("/", handler)
http.ListenAndServe(":8088", nil)
}


```

同时打开 3 个页面输出:
start
end
start
start
end
start
end
start
end
start
end
end
AlphaTr
2018-06-20 18:44:39 +08:00
我去,楼上破案了,坑了
gamexg
2018-06-20 18:47:52 +08:00
@ZSeptember #34 测试后的确时浏览器的问题,procexp 显示只有 1 个连接...
yanhejihe
2018-06-20 19:03:44 +08:00
这真是奇怪,目前不清楚原因,等破案。
nazor
2018-06-20 19:04:42 +08:00
用不同浏览器同时请求,出现这个问题可能是因为 goroutine 是针对 tcp 连接的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX