当前位置: 首页 > news >正文

vr模式的网站建设公司/友链交换平台

vr模式的网站建设公司,友链交换平台,怎样做国外能看到的网站,怎么创建图片链接在服务器开发领域,有很多未知的原因可能导致用户的请求失败。比如:你的服务器并发请求了多个下游服务,并在等待它们返回所有结果。但是很不幸,其中一个服务返回了错误,此时其它所有其它请求我们也就没有必要再等待下去…

在服务器开发领域,有很多未知的原因可能导致用户的请求失败。比如:你的服务器并发请求了多个下游服务,并在等待它们返回所有结果。但是很不幸,其中一个服务返回了错误,此时其它所有其它请求我们也就没有必要再等待下去了,而是直接返回并告诉用户本次请求失败。

上面的场景在服务器开发领域非常常见,处理起来也比较困难。无论你是写 C++ 还是 Java,或是 Nodejs,都不那么容易处理。

多说不益,我们使用一个简单的服务器模拟请求下游,并人为取消请求。

1. 请求模拟

目标:假设我们的服务同时发起三次 HTTP GET 请求下游,得到结果,并打印到屏幕。

1.1 模拟的 Get 请求函数

下面是我们自己编写的一个模拟发送 HTTP GET 请求的函数。当然它并不会真的请求某个真实的下游。这个函数可以模拟网络拥塞的场景,比如长时间不返回结果。为了能让你看到效果,我特意将请求耗时随机设置在 [2,7] 秒之间。

关于 time.After 函数就不用我多说了,前面已经讲过了,当然你也可以自行查阅文档。

func Get() string {duration := rand.Intn(5) + 2tick := time.After(time.Duration(duration) * time.Second)select {case <-tick:return fmt.Sprintf("get page %d", duration)}
}

1.2 模拟请求下游服务

package mainimport ("fmt""math/rand""sync""time"
)func Get() string {duration := rand.Intn(5) + 2tick := time.After(time.Duration(duration) * time.Second)select {case <-tick:return fmt.Sprintf("get page %d", duration)}
}func main() {rand.Seed(time.Now().Unix())var wg sync.WaitGroupwg.Add(3)go func() {fmt.Println(Get())wg.Done()}()go func() {fmt.Println(Get())wg.Done()}()go func() {fmt.Println(Get())wg.Done()}()wg.Wait()
}

下面是运行效果。


这里写图片描述
图1 并发 Get 请求

2. cancel 请求

在上一篇《火箭发射游戏》里,你已经学会了使用 channel 来取消火箭发射。其实在这里,你仍然可以借鉴这个思路。

具体的,我们可以通过创建一个 channel 来控制。修改的代码如下:

package mainimport ("fmt""math/rand""os""sync""time"
)func Get(done <-chan struct{}) string {duration := rand.Intn(5) + 2tick := time.After(time.Duration(duration) * time.Second)// 使用 select 来监听 channelselect {case <-tick:return fmt.Sprintf("get page %d", duration)case <-done:return fmt.Sprintf("cancel %d", duration)}
}func main() {rand.Seed(time.Now().Unix())// 创建一个 channeldone := make(chan struct{})var wg sync.WaitGroupgo func() {os.Stdin.Read(make([]byte, 1))// 因为我们发起了 3 次 Get 请求,所以要发送 3 次数据到 done channelfor n := 0; n < 3; n++ {done <- struct{}{}}}()wg.Add(3)go func() {fmt.Println(Get(done))wg.Done()}()go func() {fmt.Println(Get(done))wg.Done()}()go func() {fmt.Println(Get(done))wg.Done()}()wg.Wait()
}

这一次,我们再次运行,并在请求结束前,按下你的 ENTER 键来结束请求。


这里写图片描述
图2 cancel 请求

在图 2 中,第一次我没有打断请求,程序自然结束。第二次,程序一启动我就按下 ENTER 打断了请求。第三次,程序第一个请求结束后我按下 ENTER 键,打断了后面的两个 GET 请求。

那么,我们的任务就到此为止了吗?显然不会。上面的实现太不优雅了,假设我们有 100 个并发请求出去了?难道就得把循环向 channel 发送 100 次数据吗?

有没有一种方向,可以广播的通知所有的 goroutine? 答案是有的。我们利用 channel 的另一个特性:如果从一个已经关闭的 channel 读取数据,程序会立即返回而不阻塞

这样的就简单了,我们只要稍微修改一下那个看起来不太舒服的 for 循环就行:

// 不要使用这种方式了
for n := 0; n < 3; n++ {done <- struct{}{}
}// 改成下面这样
close(done)

稍作修改,你的程序就能达到和图 2 一样的效果。

3. 总结

  • 掌握 channel 的关闭后的特性
  • 掌握取消并发 goroutine 的方法

在 Golang 里,取消请求太常见了,以致于 Golang 为其实现了一些标准库来完成这些事情。下一讲,我们来看看它到底是什么。

http://www.jmfq.cn/news/5253355.html

相关文章:

  • 律师网站设计/seo怎么做优化方案
  • 花桥网站制作/适合成人参加的培训班
  • 网站客户端ip做爬虫/百度贴吧入口
  • 电子商务网站建设基础项目实训报告/关键词分析软件
  • php做用户注册网站/如何在百度上做推广
  • 英文 网站 字体/酒店网络营销方式有哪些
  • 网站开发工作职责/app关键词优化
  • 设计师网站设计/百度推广电话
  • 淘宝上做网站的靠谱吗/整合营销名词解释
  • wentommy wordpress/广州做seo的公司
  • 品牌网站建设信息/在什么网站可以免费
  • 企业网络品牌维护/长沙seo外包优化
  • wordpress 流量管理系统/aso优化教程
  • 做海外购网站/seo诊断的网络问题
  • 学做效果图的网站/今天重大新闻国内最新消息
  • 石家庄网站建设接单/百度手机助手下载安卓版
  • 中国专门做生鲜的网站/合肥关键词快速排名
  • 企业手机端网站模板/关键词歌词打印
  • 海外如何淘宝网站建设/怎么做营销
  • 网站的搜索引擎/深圳百度推广客服电话多少
  • 蔡甸做网站/百度pc端首页
  • 做新媒体的小说网站/网站关键字优化技巧
  • 网站建设费用:做个网站要多少钱?/2023网络营销成功案例
  • wordpress轻论坛主题/上海专业优化排名工具
  • 有个能写文章做任务的网站/产品推广文案
  • 网页升级访问紧急通知最新网页升级访问升级/济南seo排名优化推广
  • 浙江网站建设/推广普通话ppt课件
  • 全球b2b网站排名/建网站公司哪里好
  • 网站安全保障机制如何做/网站排名seo软件
  • 做旅行的网站/百度问答怎么赚钱