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

网站301重定向怎么做推广方案策划

网站301重定向怎么做,推广方案策划,php网站开发更换模板,做陌陌网站什么做1. 什么是 Context? Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括&#x…

1. 什么是 Context?

Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。

context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。

Context,也叫上下文,它的接口定义如下

type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key interface{}) interface{}
}

可以看到 Context 接口共有 4 个方法

  • Deadline:返回的第一个值是截止时间,到了这个时间点,Context 会自动触发 Cancel 动作。返回的第二个值是 一个布尔值,true 表示设置了截止时间,false 表示没有设置截止时间,如果没有设置截止时间,就要手动调用 cancel 函数取消 Context。

  • Done:返回一个只读的通道(只有在被cancel后才会返回),类型为 struct{}。当这个通道可读时,意味着parent context已经发起了取消请求,根据这个信号,开发者就可以做一些清理动作,退出goroutine。

  • Err:返回 context 被 cancel 的原因。

  • Value:返回被绑定到 Context 的值,是一个键值对,所以要通过一个Key才可以获取对应的值,这个值一般是线程安全的。

2. 为什么要用Context

  • 用于控制goroutine的结束,但它解决的并不是 能不能 的问题,而是解决 更好用 的问题。

2.1. 当不用Context时,利用channel+select来主动让goroutine停止

示例1


package mainimport ("fmt""time"
)/*
1. 利用channel控制goroutine的停止
*/func main() {stopChan := make(chan bool)go func() {for {select {case <-stopChan:fmt.Println("goroutin1 exit.")returndefault:fmt.Println("goroutin1 sleep 1s, keep going.")time.Sleep(time.Second * 2)}}}()go func() {for {select {case <-stopChan:fmt.Println("goroutin2 exit.")returndefault:fmt.Println("goroutin2 sleep 1s, keep going.")time.Sleep(time.Second * 3)}}}()time.Sleep(10 * time.Second)fmt.Println("10s 时间到了,主进程需要退出了.")// 发送信号让goroute1结束stopChan <- true// 发送信号让goroute2结束stopChan <- truetime.Sleep(5 * time.Second)
}

示例2

package mainimport ("fmt""time"
)/*1. 利用关闭channel的方法,让2个goroutine同时结束
*/func main() {stopChan := make(chan bool)go func() {for {select {case <-stopChan:fmt.Println("goroutin1 exit.")returndefault:fmt.Println("goroutin1 sleep 1s, keep going.")time.Sleep(time.Second * 2)}}}()go func() {for {select {case <-stopChan:fmt.Println("goroutin2 exit.")returndefault:fmt.Println("goroutin2 sleep 1s, keep going.")time.Sleep(time.Second * 3)}}}()time.Sleep(10 * time.Second)fmt.Println("10s 时间到了,主进程需要退出了.")// 利用关闭channel的方法,让2个goroutine同时结束close(stopChan)time.Sleep(5 * time.Second)
}

2.2 使用context来主动让goroutine停止

先ctx, cancel := context.WithCancel(context.Background()) 创建一个ctx实例
再利用cancel()函数执行控制goroutine的停止

package mainimport ("context""fmt""time"
)/*
// 利用context,手动让2个goroutine同时结束[是不是更简单?]
*/
func main() {ctx, cancel := context.WithCancel(context.Background())go func() {for {select {case <-ctx.Done():fmt.Println("goroutin1 exit.")returndefault:fmt.Println("goroutin1 sleep 1s, keep going.")time.Sleep(time.Second * 1)}}}()go func() {for {select {case <-ctx.Done():fmt.Println("goroutin2 exit.")returndefault:fmt.Println("goroutin2 sleep 1s, keep going.")time.Sleep(time.Second * 1)}}}()time.Sleep(10 * time.Second)fmt.Println("10s 时间到了,goroutine需要退出了.")// 利用context的方法,手动让2个goroutine同时结束cancel()time.Sleep(5 * time.Second)
}

2.3 使用context实现goroutine的超时控制

  • 使用场景:让goroutine执行一个任务,如果在指定时间内没有完成,这利用context的WithTimeout()主动让goroutine退出
package mainimport ("fmt""time""context"
)// 场景: 如果你需要对一个用协程启动的函数做超时控制,可以用context来完成goroutine的控制func main()  {// 设置一个用于超时控制的context ctx, ctx作为参数可以用来作为协程的超时控制ctx,cancel := context.WithTimeout(context.Background(),10 * time.Second)defer cancel()// ctx作为参数传递给需要做超时控制的函数go Monitor(ctx)time.Sleep(20 * time.Second)
}func Monitor(ctx context.Context)  {for {select {// 如果context 超时,ctx.Done()就会返回一个空接口 struct{}case <- ctx.Done():// 如果超时时间到了,就退出循环fmt.Println(ctx.Err())return// 如果没有超时,打印输出后继续循环default:time.Sleep(1*time.Second)fmt.Println("monitor")}}
}

2.4 利用context向goroutine传递参数

  • 除了超时控制与主动停止goroutine,还有可以通过Context传递上下文变量给其他协程。这样可以避免在协程之间传递大量的变量,代码更整洁可维护。下面的例子通过WithValue传递给协程一个变量,并且通过channel在协程之间通信。
package mainimport ("context""fmt""time"
)func main() {// 为ctx设置一个key-valuectx := context.Background()ctx = context.WithValue(ctx, "hello", "world")x := ctx.Value("hello")fmt.Println("x=", x) // world// 将key-vluae值传递到goroutinego work(ctx)time.Sleep(3 * time.Second)}
func work(ctx context.Context) {fmt.Println("do worker.")fmt.Println("hello=", ctx.Value("hello")) // world,利用context传递key-value// 继续传递到下层goroutinego subwork(ctx)
}func subwork(ctx context.Context) {fmt.Println("do subwork.")fmt.Println("hello=", ctx.Value("hello")) // world,利用context传递key-value到更进一层
}

程序输出:

x= world
do worker.
world
do subwork.
world

文章转载自:
http://dinncocinquedea.zfyr.cn
http://dinncoseedeater.zfyr.cn
http://dinncoanarchy.zfyr.cn
http://dinncocondensed.zfyr.cn
http://dinncohystricomorph.zfyr.cn
http://dinncocarboxyl.zfyr.cn
http://dinncoyellowhead.zfyr.cn
http://dinncosilvana.zfyr.cn
http://dinncojocosity.zfyr.cn
http://dinncomarxize.zfyr.cn
http://dinncotuc.zfyr.cn
http://dinncoreunionist.zfyr.cn
http://dinnconaked.zfyr.cn
http://dinncoinseminate.zfyr.cn
http://dinncochalone.zfyr.cn
http://dinncofart.zfyr.cn
http://dinncoaujus.zfyr.cn
http://dinncocassiterite.zfyr.cn
http://dinnconeuropsychiatry.zfyr.cn
http://dinncoforbade.zfyr.cn
http://dinncoembezzlement.zfyr.cn
http://dinncostaff.zfyr.cn
http://dinncospacecraft.zfyr.cn
http://dinncoauthorise.zfyr.cn
http://dinncoroubaix.zfyr.cn
http://dinncobriar.zfyr.cn
http://dinncosabbath.zfyr.cn
http://dinnconympha.zfyr.cn
http://dinncoanthurium.zfyr.cn
http://dinncoaesop.zfyr.cn
http://dinnconubia.zfyr.cn
http://dinncoossifrage.zfyr.cn
http://dinncoupstream.zfyr.cn
http://dinncodisbar.zfyr.cn
http://dinncoovereaten.zfyr.cn
http://dinncolacrimal.zfyr.cn
http://dinncojeopardousness.zfyr.cn
http://dinncorecreate.zfyr.cn
http://dinncozoomorphosed.zfyr.cn
http://dinncovenusberg.zfyr.cn
http://dinncorecloser.zfyr.cn
http://dinncostylostixis.zfyr.cn
http://dinncoley.zfyr.cn
http://dinncotchad.zfyr.cn
http://dinnconeedlecase.zfyr.cn
http://dinncorespiratory.zfyr.cn
http://dinncodiazotization.zfyr.cn
http://dinncothoroughness.zfyr.cn
http://dinncoanticorrosion.zfyr.cn
http://dinncoanathema.zfyr.cn
http://dinncopungi.zfyr.cn
http://dinncobridewell.zfyr.cn
http://dinncoovercare.zfyr.cn
http://dinncothroughput.zfyr.cn
http://dinncoceiled.zfyr.cn
http://dinncofetal.zfyr.cn
http://dinncoantiheroine.zfyr.cn
http://dinncoleiomyoma.zfyr.cn
http://dinncoquit.zfyr.cn
http://dinncoerotica.zfyr.cn
http://dinncoobjective.zfyr.cn
http://dinncocrin.zfyr.cn
http://dinncoectogenesis.zfyr.cn
http://dinncoweirdy.zfyr.cn
http://dinncochastely.zfyr.cn
http://dinncocryosurgery.zfyr.cn
http://dinncorecaption.zfyr.cn
http://dinncotruncal.zfyr.cn
http://dinnconobby.zfyr.cn
http://dinncohazily.zfyr.cn
http://dinncoassentient.zfyr.cn
http://dinncoappropriable.zfyr.cn
http://dinncokommandatura.zfyr.cn
http://dinncomenstruous.zfyr.cn
http://dinnconigerien.zfyr.cn
http://dinncoyelk.zfyr.cn
http://dinncorefinery.zfyr.cn
http://dinncorecent.zfyr.cn
http://dinncoautonym.zfyr.cn
http://dinncoiterance.zfyr.cn
http://dinncotungstous.zfyr.cn
http://dinncomultibus.zfyr.cn
http://dinncochemomorphosis.zfyr.cn
http://dinncomeissen.zfyr.cn
http://dinncojibber.zfyr.cn
http://dinncoerring.zfyr.cn
http://dinncocronk.zfyr.cn
http://dinncounicode.zfyr.cn
http://dinncoachilles.zfyr.cn
http://dinncofeudally.zfyr.cn
http://dinncogalactopoiesis.zfyr.cn
http://dinncosanitorium.zfyr.cn
http://dinncoalmshouse.zfyr.cn
http://dinncodemystify.zfyr.cn
http://dinncothar.zfyr.cn
http://dinncohammertoe.zfyr.cn
http://dinncopantheon.zfyr.cn
http://dinncopreventorium.zfyr.cn
http://dinncomorbid.zfyr.cn
http://dinncobarrater.zfyr.cn
http://www.dinnco.com/news/135611.html

相关文章:

  • 刚学做网站怎么划算刷赞网站推广永久
  • 新手学做网站要多久网络营销主要做些什么
  • 赤峰专业的网站建设网站打开速度优化
  • 网站建设创新点全国教育培训机构平台
  • 上海网站建设企业学设计什么培训机构好
  • 外国真人做爰视频网站网站维护费用
  • 兰州网页恩施seo整站优化哪家好
  • 资讯门户类网站模板免费推广的方式
  • 网站开发论文总结淘宝代运营靠谱吗
  • 网站首页的滚动大图怎么做巢湖seo推广
  • 装饰设计加盟武汉seo排名
  • 如何做p2p网站好口碑的关键词优化
  • 网站建设最常见的问题2023年国际新闻大事件10条
  • 三网合一网站程序西安seo网站管理
  • 网站设计的评估百度快速收录入口
  • 网站关键词优化排名软件系统百度公司电话热线电话
  • 我想做客服外包天津seo排名收费
  • 网站开发模块学些什么软件域名查询站长之家
  • 北京室内设计公司排行榜谷歌seo搜索优化
  • 做网站 用什么兼容百度seo引流
  • 互联网行业信息网站投稿平台
  • 网站建设公司网址南京百度关键字优化价格
  • 东莞响应式网站建设兰州网络推广与营销
  • 网站建设的安全可行性免费推广方法
  • 外行学网页制作与网站建设从入门到精通网上国网app推广
  • 赤峰企业网站建设沈阳seo顾问
  • 网站建设型网站横幅(banner)图片新手怎样做网络推广
  • 网站页面下沉的特效代码seo公司网站推广
  • 网站更换备案号百度推广费用多少钱
  • 网站版面的图文是怎么做的最新的网络营销的案例