前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2020-09-09:裸写算法:两个线程轮流打印数字1-100。

2020-09-09:裸写算法:两个线程轮流打印数字1-100。

原创
作者头像
福大大架构师每日一题
修改于 2020-09-10 02:08:56
修改于 2020-09-10 02:08:56
87000
代码可运行
举报
运行总次数:0
代码可运行

福哥答案2020-09-09:

方法1:用一个通道,两个go程的代码不一样。

方法2:用两个通道,两个go程的代码完全一样。可以扩展成N个go程轮流打印。

代码用golang编写,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test38_alternateprint

import (
    "fmt"
    "testing"
    "time"
)

var POOL = 10

//go test -v -test.run TestAlternatePrint
func TestAlternatePrint(t *testing.T) {
    AlternatePrint1()
    AlternatePrint2()
}

//方法1
func AlternatePrint1() {
    fmt.Println("方法1,两个协程的代码不一样")
    msg := make(chan int)
    go func(p chan int) {
        for i := 1; i <= POOL; i++ {
            p <- i
            if i%2 == 1 {
                fmt.Println("groutine-1:", i)
            }
        }
    }(msg)
    go func(p chan int) {
        for i := 1; i <= POOL; i++ {
            <-p
            if i%2 == 0 {
                fmt.Println("groutine-2:", i)
                fmt.Println("")
            }
        }
    }(msg)

    //等待协程执行完成
    time.Sleep(time.Second * 1)
}

//方法2
func AlternatePrint2() {
    fmt.Println("方法2,两个go程的代码完全一样")
    const N = 2
    chs := make([]chan struct{}, N)
    for i := 0; i < N; i++ {
        chs[i] = make(chan struct{}, 0)
    }
    start := 1
    for i := 0; i < N; i++ {
        go func(i int) {
            for start <= POOL-N+1 {
                //获得执行权
                <-chs[i]

                //执行代码
                fmt.Printf("go程%d:%d\r\n", i, start)
                if (i+1)%N == 0 {
                    fmt.Println("")
                }
                start++

                //给其他协程执行权
                chs[(i+1)%N] <- struct{}{}
            }
        }(i)
    }

    //给第1个协程执行权,第1个协程的序号是0
    chs[0] <- struct{}{}

    //等待协程执行完成
    time.Sleep(time.Second * 1)

    //收回最后1个go程的执行权
    <-chs[POOL%N]
}

敲 go test -v -test.run TestAlternatePrint 命令,结果如下:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你Golang的协程池设计
现在很多公司都在陆续的搭建golang的语言栈,大家有没有想过为什么会出现这种情况?一是因为go比较适合做中间件,还有一个原因就是go的并发支持比较好,也就是咱们平时所谓的高并发,并发支持离不开协程,当然协程也不是乱用的,需要管理起来,管理协程的方式就是协程池,所以协程池也并没有那么神秘,今天咱们就来一步一步的揭开协程池的面纱,如果你没有接触过go的协程这块的话也没有关系,我会尽量写的详细。
程序员小饭
2021/06/22
1.2K0
手把手教你Golang的协程池设计
GO 语言的并发模式你了解多少?
实际上,出现上述的情况,还是因为我们对于 GO 语言的并发模型和涉及的 GO 语言基础不够扎实,误解了语言的用法。
阿兵云原生
2023/10/24
3730
GO 语言的并发模式你了解多少?
golang的两把利器,协程和管道
golang的协程相信大家都不陌生,在golang中的使用也很简单,只要加上一个关键字「go」即可,虽然说大家都知道,但是真的在实际使用中又遇到这样那样的问题,坑其实还是挺多的。而网上很多文章和教程,要么就是讲的太简单,给你简单介绍一下协程和管道的使用,「点到为止」,要么就上来给你撸GPM模型,看的人「一脸懵逼」,所以我以「实际使用过程中遇到的问题」这个角度出发,可能会分多篇总结一下golang的协程相关的知识点
程序员小饭
2023/02/24
3240
golang的两把利器,协程和管道
Go 实现用两个协程顺序打印奇数和偶数
_春华秋实
2023/09/07
4800
深入浅出Golang的协程池设计
虽然go语言在调度Goroutine已经优化的非常完成,并且Goroutine作为轻量级执行流程,也不需要CPU调度器的切换,我们一般在使用的时候,如果想处理一个分支流程,直接go一下即可。
李海彬
2018/12/11
2.6K0
深入浅出Golang的协程池设计
【Go 语言社区】并发性
并发性 并发的特点是需要锁Lock和互斥Mutex。在Java中加锁和解锁是一个复杂过程代码如下: try { mutex.acquire(); try { // do something } finally { mutex.release(); } } catch(InterruptedException ie) { // ... } 并发另外一个特性是异步,各种语言都有自己的异步机制,基于回调的有: Ruby的 EventMachine Python的 Twisted
李海彬
2018/03/20
8060
【Go 语言社区】并发性
go语言协程实现原理初探
golang作为一门现代语言,有其独特之处,比如一个go func(){}()语句即可实现协程,但也存在一些让人诟病的地方,比如错误处理等等。但是想必人无完人,无物完物。我们今天聊聊golang的协程(也叫goroutine)。首先提到协程,我们会想到进程,线程,那么协程是什么呢?协程是一种用户态的线程,他可以由用户自行创建和销毁,不需要内核调度,创建和销毁不需要占用太多系统资源的用户态线程。所以通常情况下,对于大并发的业务,我们通常能创建数以万计的协程来并发处理我们的业务,而不用担心资源占用过多。所以go的协程的作用就是为了实现并发编程,它是由go自己实现的调度器实现资源调度,从而开发者不用太多关心并发实现,从而可以安心的写一些牛逼的业务代码。
金鹏
2024/02/07
7263
go语言协程实现原理初探
Golang之并发篇
进程和线程 A。进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 B。线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
超蛋lhy
2018/08/31
4960
Golang之并发篇
并发模式
并发模式并不是一种函数的运用、亦或者实际存在的东西。他是前人对于并发场景的运用总结与经验。他与23中设计模式一样。好啦,话不多说。开干
PayneWu
2021/03/10
3000
原来服务端的退出姿势也可以这么优雅
这个功能非常简单,就是监听了本地的 9090 端口,并且其中有一个 url 是会处理请求的,/getinfo ,咱们可以通过如下指令来请求一下看看效果
阿兵云原生
2023/02/16
3430
盘点Golang并发那些事儿之二
上一节提到,golang中直接使用关键字go创建goroutine,无法满足我们的需求。主要问题如下
PayneWu
2021/06/10
5120
盘点Golang并发那些事儿之二
golang 裸写一个pool池控制协程的大小
http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770&idx=1&sn=044be64c577a11a9a13447b373e
李海彬
2018/03/26
1K0
《快学 Go 语言》第 12 课 —— 神秘的地下通道
不同的并行协程之间交流的方式有两种,一种是通过共享变量,另一种是通过队列。Go 语言鼓励使用队列的形式来交流,它单独为协程之间的队列数据交流定制了特殊的语法 —— 通道。
老钱
2018/12/24
4180
《快学 Go 语言》第 12 课 —— 神秘的地下通道
[警惕] 请勿滥用goroutine
在Go语言中,goroutine的创建成本很低,调度效率高,Go语言在设计时就是按以数万个goroutine为规范进行设计的,数十万个并不意外,但是goroutine在内存占用方面确实具有有限的成本,你不能创造无限数量的它们,比如这个例子:
Golang梦工厂
2022/07/11
5060
[警惕] 请勿滥用goroutine
这些 channel 用法你都用起来了吗?
channel 通道是可以让一个 goroutine 协程发送特定值到另一个 goroutine 协程的通信机制。
阿兵云原生
2023/10/24
3060
这些 channel 用法你都用起来了吗?
Go语言学习——channel的死锁其实没那么复杂
  协程(goroutine)算是Go的一大新特性,也正是这个大杀器让Go为很多路人驻足欣赏,让信徒们为之欢呼津津乐道。
JackieZheng
2019/07/11
1K0
探究 Go 的高级特性之 【处理1分钟百万请求】
对于大型的互联网应用程序,如电商平台、社交网络、金融交易平台等,每秒钟都会收到大量的请求。在这些应用程序中,需要使用高效的技术来应对高并发的请求,尤其是在短时间内处理大量的请求,如1分钟百万请求。
CPP开发前沿
2023/09/15
3190
探究 Go 的高级特性之 【处理1分钟百万请求】
Go语言并发之并发实现、多核CPU设置、多协程间的通信、select、多协程间的同步(二十一)
Go语言并发之并发实现、多核CPU设置、多协程间的通信、select、多协程间的同步 目录结构
友儿
2022/09/11
1K0
golang 简单连接池
参考链接:https://blog.csdn.net/finghting321/article/details/106492915/
码缘
2023/01/07
2900
go 并发模式
boring返回一个channel,不断往里写数据。main调用,并从channel中获取数据,结果如下:
solate
2022/10/28
5800
go 并发模式
相关推荐
手把手教你Golang的协程池设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验