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

全屏网站大小做视频网站利润如何

全屏网站大小,做视频网站利润如何,专业制作网站有哪些,网站建设培训会讲话一个空的 channel 会产生哪些问题 读写nil管道均会阻塞触发死锁。关闭的管道仍然可以读取数据#xff0c;向关闭的管道写数据会触发panic。 问#xff1a;如果有多个协程同时读取一个channel#xff0c;channel会如何选择消费者 channel 会按照维护的 recvq 等待读消息的…一个空的 channel 会产生哪些问题 读写nil管道均会阻塞触发死锁。关闭的管道仍然可以读取数据向关闭的管道写数据会触发panic。 问如果有多个协程同时读取一个channelchannel会如何选择消费者 channel 会按照维护的 recvq 等待读消息的协程队列按照FIFO的顺序选择消费者 我们先来看一下 channel 源码 type hchan struct {qcount uint // 当前队列中剩余元素个数dataqsiz uint // 环形队列长度即可以存放的元素个数buf unsafe.Pointer // 环形队列指针 缓冲区elemsize uint16 // 每个元素的大小closed uint32 // 标识关闭状态elemtype *_type // 元素类型sendx uint // 队列下标指示元素写入时存放到队列中的位置recvx uint // 队列下标指示下一个被读取元素在队列中的位置recvq waitq // 等待读消息的协程队列sendq waitq // 等待写消息的协程队列lock mutex // 互斥锁chan不允许并发读写 }向管道写数据 向一个管道中写数据的简单过程如下 如果缓冲区中有空余位置则将数据写入缓冲区结束发送过程如果缓冲区中没有空余位置则将当前协程加入sendq队列进入休眠并等待被读协程唤醒 简单流程如下图所示 向管道读数据 channel 会维护一个等待读消息的协程队列 recvq当一个协程读取消息时的简单过程如下 如果缓冲区中有数据则从缓冲区中取出数据结束读取过程如果缓冲区中没有数据则将当前协程加入 recvq 队列进入休眠并等待被写协程唤醒 如果 sendq 不为空且没有缓冲区则会从 sendq队列的第一个协程中获取数据 简单流程如下图所示 编写一个程序测试一下 func main() {c : make(chan int)wg : sync.WaitGroup{}wg.Add(100)go func() { // G1for {a : -cfmt.Println(1, a)wg.Done()}}()go func() { // G2for {a : -cfmt.Println(2, a)wg.Done()}}()go func() { // G3for {a : -cfmt.Println(3, a)wg.Done()}}()go func() { // G4for {a : -cfmt.Println(4, a)wg.Done()}}()time.Sleep(1 * time.Second) // 等待四个协程排好队for i : 0; i 100; i {c - i}wg.Wait() } 按照上面协程读取消息的过程会发生什么呢 当c还未被写入消息时 G1~G4 以FIFO的原则排好队比如现在的recvq的顺序为 G1、G2、G3、G4当主协程发送消息时无缓冲区直接从recvq 队列中取出头部G 随后再添加到队尾c中的数据按照G1、G2、G3、G4的顺序依次被读取 那实际执行结果是怎样的呢 在我多次测试后发现前四个数会被每个协程消费一次随后会出现大片数据被同一协程消费的情况 3 2 // 前四次 3 4 3 5 3 6 3 7 3 8 3 9 3 10 3 11 3 12 3 13 3 14 3 15 3 16 3 17 3 18 3 19 3 20 3 21 3 22 3 23 3 24 3 25 3 26 3 27 3 28 3 29 3 30 3 31 3 32 3 33 3 34 3 35 3 36 3 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 3 47 3 48 3 49 3 50 3 51 3 52 3 53 3 54 3 55 3 56 3 57 3 58 3 59 3 60 3 61 3 62 3 63 3 64 3 65 3 66 3 67 3 68 3 69 3 70 3 71 3 72 3 73 3 74 3 75 3 76 3 77 3 78 3 79 3 80 3 81 3 82 3 83 3 84 3 85 3 86 3 87 3 88 3 89 3 90 3 91 3 92 3 93 3 94 3 95 3 96 3 97 3 98 3 99 2 1 // 前四次 1 0 // 前四次 4 3 // 前四次Process finished with the exit code 0 出现这种情况可能与GMP调度模型有关系当我们继续增大数据量后比如增加到10000会发现每个协程读取chan的次数其实差不多。 当我们向管道写数据时添加一个间隔时间 func main() {c : make(chan int)wg : sync.WaitGroup{}wg.Add(100)go func() { // G1for {a : -cfmt.Println(1, a)wg.Done()}}()go func() { // G2for {a : -cfmt.Println(2, a)wg.Done()}}()go func() { // G3for {a : -cfmt.Println(3, a)wg.Done()}}()go func() { // G4for {a : -cfmt.Println(4, a)wg.Done()}}()time.Sleep(1 * time.Second) // 等待四个协程排好队for i : 0; i 100; i {time.Sleep(1 * time.Millisecond) // 每隔1ms 发送一次c - i}wg.Wait() }执行程序会发现按照某种固定的顺序输出这时完全符合上图的读的过程的 1 0 2 1 3 2 4 3 1 4 2 5 3 6 4 7 ... ps如果有哪位老哥知道为什么会出现一个协程连续输出的情况欢迎在评论区讨论
http://www.zqtcl.cn/news/3186/

相关文章:

  • 上海做网站推荐承德网站开发
  • 网站建设公司创业可以做雷达图的网站
  • 环评怎么在网站做公示广州手机网站建设价格
  • 客户网站开发全流程html注册登录界面代码
  • 网站权重是怎么提升的wordpress添加51统计
  • 莱芜建设网站如何查询网站快照
  • 做关于灯饰的网站重庆外贸网站建设公司排名
  • 做空气开关那个网站推广比较好ui设计流程培训怎么样
  • 电子商务网站建设课程设计总结网站建设服务器配置
  • 网站建设与维护怎么学怎么做网络营销推广
  • 建设代刷网站dz网站建设
  • 网站设计制做报价东莞专业做网站的公司
  • 专门做流程图的网站免费网络电话试用
  • 个人网站设计作品图片wordpress如何设置文章模板
  • 如何设置网站的默认页室内装饰设计公司
  • PS的网站工信部网站查询
  • 如何用自己电脑做网站页面苏州浒关网站建设
  • 网站建设公司的案例宣传网站站点最有效的方式是
  • 昆明网站快照优化公司南宁关键词优化软件
  • 静态网站开发文章网址大全12345
  • 做qq的网站永州网页制作
  • 万网如何上传网站百度商桥网站代码去哪里添加
  • 整站优化的公司美妆网站源码asp
  • 怎样在设计网站做图赚钱领英如何创建公司主页
  • 举报非法网站要求做笔录北京网站设计浩森宇特
  • 进贤南昌网站建设公司wordpress网站教程
  • 中国建设监理协会网站会员专区做网站虚拟主机
  • 网站开发制作公司名称wordpress 中文语言
  • 成都网站开发收费网站怎么看被百度收录
  • 北京网站设计制作招聘信息合肥专业做网站公司有哪些