如何从外部取消访问网页的go程?

比如说,我为了更快的获得某个网页,同时发起了10个go程,分别通过不同的代理去抓取该网页,那么当我从某个go程获得返回后,就需要关闭其余9个以释放资源。

但是此时这9个go程,按照一般的写法,大概率是阻塞在http.Get或者类似的函数上,这个情况下,go程无法再从外部获取信息了———因为已经阻塞住了。

请问各位大兄弟,这种情况下程序逻辑要怎么写才能从外部关闭那9个go程?

已邀请:

Chaofei

赞同来自:

应该没有办法从外部杀死一个 go 程,这种最好在 http.Get 时加上超时,go 程执行完就退出了。

xmgee - 90后

赞同来自:

应该是不行的

cuiweixie

赞同来自:

这个不好搞,不行

haohongfan - talk is expensive, just show code

赞同来自:

可以考虑用信号实现

windzhu0514

赞同来自:

context包是用来干吗的? Request.WithContext

bfcaicai - 向往niubility...

赞同来自:

channel 读取到任意一个处理完成信号程序退出

lifei6671 - PHPer

赞同来自:

其实内置的http.Request支持取消操作:

老版本用的是 Request 的 Cancel 属性,新版本用的事 WithContext 方法.

ctx,cancel := context.WithCancel(context.Background())
req,err := http.NewRequest(http.MethodGet,"https://www.baidu.com",nil )
if err != nil {
    return
}

req = req.WithContext(ctx)
c := http.Client{}
resp,err := c.Do(req)
//取消请求
cancel()

要回复问题请先登录注册