一些面试取经后自己梳理的知识点总结
[Read More]Golang实现伪AI?
最近网上流传某段子,就是蹭了下当下最火的AI大法的流量。
[Read More]【译】Golang友好的设计API参数可选项
翻译一篇老外大佬的文章,他的这篇核心观点也是Go语言创始人之一 Rob Pike 提出的。
最近无意间进入到一位 Go 社区大佬的博客,看见了这样一片博文,主要讲Golang的API设计特别是对于函数方法的可选参数相关的点,所以自己试着进行翻译吧。Functional options for friendly APIs
[Read More]goroutine如何退出任务和goroutine生命周期的控制(runner并发模式)
关于goroutine的生命周期及其控制过程
开了goroutine如何才能退出呢?如何控制它并了解其生命周期?这里包括主动退出和外部的被动退出
[Read More]RPC与Grpc(上部)
关于微服务之间调用实现原理
我们的微服务就是基于grpc进行远程调用的,而grpc是一款优秀的跨语言 RPC 调用框架
[Read More]通过channel控制goroutine数量形成协程池
还需要多加强并发编程能力
最近业务上需要利用大量开goroutine去并发拉取数据,但是不能无限制的 for 数据长度来开启那么多的goroutine,就要写个协程池来协调,通过channel来限制goroutine的开启数量。
业务需求: 需要生产者去每日定时拉去第三方平台数据,放入到channel缓存通道中(类型存入消息队列),消费者需要开goroutine并发的进行拉取第三方平台数据整合后再插入表中,其中goroutine开启数与channel缓存接受到的数据之间形成了协程池,从而通过了channel控制goroutine开启的数据(原理就是带缓存channel不够时会阻塞,当缓存满时也会阻塞等待消费)
代码详解: 首先声明相关变量常量等数据: 假设拉取数据可达到10W条:
const ( channelBufferSize = 1000 // channel 缓存数 goSize = 100 // 协程开启 最大数 ) // 声明一个用于定义channel的结构体 type Job struct { BucketName string // 存放 bucket 名称 Count int // 计算 重试次数 } // 全局声明该 带缓存的 channel var channlBucket = make(chan *Job, channelBufferSize) 构建生产者:
func Producer() (err error) { // 获取第三方业务相关数据,用于消费者函数调用的参数 bucketNameList, err := qiniu.GetV2sBucketNameList() if err !
[Read More]
大厂1号面试
一次大厂面试经历,积累经验
如果你觉得到了技术瓶颈,我的建议是投大厂简历然后去面试,在面试过程中你会发现你的不足。
[Read More]