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

网站浏览器兼容性问题免费培训网站

网站浏览器兼容性问题,免费培训网站,那个网站做创意图比较好,跨境网站开发✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

163. Go hand off 整个分离流程是什么?

当前线程 M 阻塞时,释放 P,给其它空闲的 M 处理。

在这里插入图片描述

164. GMP 中 hand off 机制又是什么?

GMP 中的 hand off 机制是指在某个 M 线程需要将当前正在执行的 Goroutine 交给另一个 M 线程时,使用的一种机制。

具体地,hand off 机制的实现过程如下:

当一个 M 线程需要将当前正在执行的 Goroutine 交给另一个 M 线程时,它会将该 Goroutine 和一个指向目标 M 线程的指针打包成一个结构体,称为 hand off 对象。
当目标 M 线程的本地队列中没有 Goroutine 可供执行时,它会从全局队列中获取一个 hand off 对象,并尝试将其中的 Goroutine 从原来的 M 线程中获取出来,添加到自己的本地队列中执行。在此期间,当前 M 线程会不断尝试从全局队列中获取 Goroutine 并将其调度到本地队列中执行。

当目标 M 线程成功获取到 hand off 对象后,它会将其中的 Goroutine 添加到自己的本地队列中,并将它们调度到绑定的 P 上执行。

hand off 机制的好处是可以避免线程饥饿,提高 Goroutine 的调度效率。当一个 M 线程需要将当前正在执行的 Goroutine 交给另一个 M 线程时,可以使用 hand off 机制来尽快地将 Goroutine 交给目标 M 线程,从而避免线程饥饿的问题。同时,由于 hand off 机制只在需要将当前正在执行的 Goroutine 交给另一个 M 线程时才会被使用,因此相对于 work stealing 机制来说,它的实现比较简单,不会增加太多额外的开销。

165. 如何实现 GMP 中的 hand off 机制?

由于 hand off 机制的使用场景比较特殊,且需要涉及到多个 Goroutine 之间的交互,因此比较难以直接演示。

不过,我们可以通过一个简单的示例来说明 hand off 机制的基本使用方法和效果。
假设我们有一个生产者-消费者模型,其中有多个生产者 Goroutine 和多个消费者 Goroutine,它们都需要不断地从一个共享的队列中获取任务进行处理。为了提高并发效率,我们可以使用 GMP 模型来对任务进行调度。

在这个示例中,我们使用一个全局队列来存储任务,并使用 hand off 机制来将任务从一个 M 线程转移到另一个 M 线程。每个生产者 Goroutine 和消费者 Goroutine 都会不断地尝试从全局队列中获取任务,并将其添加到自己的本地队列中执行。当某个 Goroutine 的本地队列为空时,它会从全局队列中获取一个 hand off 对象,并将其中的 Goroutine 从原来的 M 线程中获取出来,添加到自己的本地队列中执行。在此期间,其他 Goroutine 也可以从全局队列中获取任务,并将其添加到自己的本地队列中执行。

示例代码如下:

package main
import ("fmt""sync""time"
)
// 全局变量,用于保存正在处理的任务
var currentTask int
func producer(tasks chan<- int, wg *sync.WaitGroup) {defer wg.Done()// 生产 10 个任务for i := 1; i <= 10; i++ {fmt.Printf("producer producing task %d\n", i)tasks <- itime.Sleep(time.Second)}// 关闭任务通道close(tasks)
}
func consumer(id int, tasks <-chan int, done chan<- bool, wg *sync.WaitGroup) {defer wg.Done()for task := range tasks {fmt.Printf("consumer %d processing task %d\n", id, task)// 模拟处理任务的耗时time.Sleep(time.Second)// 交出任务,使用 hand off 机制currentTask = taskdone <- true}fmt.Printf("consumer %d has processed all tasks\n", id)
}
func main() {var wg sync.WaitGroup// 任务通道tasks := make(chan int)// done 通道,用于实现 hand off 机制done := make(chan bool)// 启动 3 个 consumer goroutinefor i := 1; i <= 3; i++ {wg.Add(1)go consumer(i, tasks, done, &wg)}// 启动 producer goroutinewg.Add(1)go producer(tasks, &wg)// 等待所有 goroutine 执行完毕wg.Wait()// 所有任务处理完毕后,输出最后一个交出任务的 consumer ID 和任务 IDfmt.Printf("last consumer to hand off task: %d, task ID: %d\n", currentTask%3+1, currentTask)
}

在这个示例中,我们定义了一个全局变量 currentTask,用于保存当前正在处理的任务。在 consumer goroutine 中,当处理完一个任务后,使用 hand off 机制将任务交出,并更新 currentTask 的值。在程序结束时,我们可以通过输出 currentTask 的值来查看最后一个交出任务的 consumer ID 和任务 ID。

http://www.15wanjia.com/news/26355.html

相关文章:

  • 怎么备案网站空间天津百度推广网络科技公司
  • 泰州网站建设与网页制作aso优化{ }贴吧
  • 遵义网站建设哪家好短链接购买
  • 网站开发好吗google seo 优化
  • 浦东新区苏州网站建设事件营销案例
  • 湖南移动网站建设学生网页设计模板
  • 网站备案备的是域名还是空间杭州seo靠谱
  • 彩票开发网站建设应该要注意哪些问题搜狐三季度营收多少
  • 婚恋交友网站建设策划百度收录教程
  • 集团网站建设价格seo sem
  • 购物返利网站怎么做免费b站推广网站入口2020
  • 网站正在建设中英文爱站小工具圣经
  • 网站建设与管理专业信息流广告模板
  • 济南网站建设费用口碑营销有哪些方式
  • 肇庆企业网站建设seo整站优化新站快速排名
  • 江苏专业网站建设公司电话培训机构退费法律规定
  • 做问答网站要多少钱站长工具seo客户端
  • 企业网站页面百度seo公司
  • 做企业网站公司报价电商运营主要做什么
  • 查看本分行优就业seo怎么样
  • 一般网站建设费用预算哪里有网页设计公司
  • 上海网站推广汉狮seo网络培训
  • 专业做网站联系方式搜索引擎入口
  • 中山建网站最好的公司品牌型网站设计推荐
  • 做餐饮网站河北百度推广seo
  • 大连网站制作推广网站推广什么意思
  • 越秀企业网站建设5118大数据平台官网
  • html5后台网站模板高端建站
  • seo成功案例分析seo优化排名百度教程
  • 哪些网站seo做的好关键词优化软件有哪些