reqwest - 简单,易用的 Golang 网络请求库

2019-09-29 12:56:14 +08:00
 winterssy

Features:

Github: https://github.com/winterssy/reqwest

6663 次点击
所在节点    分享创造
29 条回复
deletelazy
2019-09-29 22:46:02 +08:00
@deletelazy 额,似乎要手动加锁。。感觉不是太友好
deletelazy
2019-09-29 22:52:44 +08:00
似乎并发 GET,POST 等也有问题

package main

import (
"fmt"
)

func main() {
cs := make(chan *Client, 100)
for i := 0; i < 10; i++ {
go func(i int) {
if i%2 == 1 {
cs <- Get("123")
} else {
cs <- Post("456")
}
}(i)
}
for {
select {
case c := <-cs:
fmt.Println(c.method, c.url)
}
}
}
winterssy
2019-09-29 23:35:45 +08:00
@deletelazy #22 因为是链式操作,自动加锁就要每一步都加锁,这样不是很好,所以改成了手动加锁。而且你的测试例子明显就有问题,Get("123"),Post("456") 无论你创建多少个都是共享同一个 client——std,如果你真要这么玩,先 New()一个。
func main() {
cs := make(chan *Client, 100)
for i := 0; i < 10; i++ {
go func(i int) {
if i%2 == 1 {
cs <- New().Get("123")
} else {
cs <- New().Post("456")
}
}(i)
}

for {
select {
case c := <-cs:
fmt.Println(c.method, c.url)
}
}
}
deletelazy
2019-09-30 00:50:02 +08:00
并发请求都要加锁的话效率是不是太低了
如果并发请求使用每次 New 的方式,创建一堆对象浪费内存不说,每个请求新建一个 transport,连接也无法复用
而且每次并发请求都要 New 的话,那这些全局方法还有什么意义呢
winterssy
2019-09-30 00:56:08 +08:00
@deletelazy 并发不加锁如何解决数据竞争问题?而且并发你不需要 New,会复用 http client,这里提到 New 只是针对你贴出的代码而言
winterssy
2019-09-30 00:57:04 +08:00
@deletelazy 提出问题前请先仔细阅读 api 文档
deletelazy
2019-09-30 01:11:20 +08:00
那你可以看下其他的 http 库或者看下 http.Get
的实现有没加锁
winterssy
2019-09-30 01:40:25 +08:00
@deletelazy 这根本没有可比性,net/http 在底层就实现了线程安全。而 sreq 是对 http api 的上层封装,它的设计决定了要加锁。且目前大多基于 net/http 封装的 request 库要么不支持并发安全,要么每次请求前克隆一份配置,要么加锁。结合具体场景分析,别章口就来😓
fengkx
2019-09-30 07:54:47 +08:00
@fengkx
@winterssy 单位看反了 /(ㄒoㄒ)/~~。看到了多一次内存分配下意识地看错了

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

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

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

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

© 2021 V2EX