Golang 协程并发更新共享数据

前言 以论坛项目为例,其中一个常见的统计更新需求是发布主题或回帖时会相应累加更新数据库相关统计表中目标日期对应的主题数或发帖数。考虑到这种性质的统计数据其实并不需要纯实时更新且增加不必要的数据库写压力,我们可以在 Golang 层面从数据库初始化存储至内存变量并在相应处理业务中更新相关的统计数据变量,再定时更新至数据库即可。 但这里有一个典型的问题是竞态条件(race condition),即数据一旦被多个线程共享操作,那么就很可能会产生争用和冲突的情况,这往往会破坏共享数据的一致性。如果不对这...阅读全文

Segmentfault 2020-04-23 13:32:35 NoTryNoSuccess

2020 Golang字节面试经验分享

2020年4月份字节跳动后端面试经验 第一面 远程使用牛客网进行面试 面试官首先介绍说会有几轮面试 算法题 1.1 将整数转换二进制然后将负数 算法题 1.2 买卖股票的最大利润 给定一个数组代表股票每天的价格,请问买卖多次的情况下,最大化利润是多少?日期不重叠的情况下,可以买卖多次?输入: {100, 80, 120, 130, 70, 60, 100, 125} 可以买卖多次: 115(80买进,130卖出;60 买进,125卖出)提示:不用输出买卖的序列,只需要得到最大利润 时间复杂度是多...阅读全文

Segmentfault 2020-04-23 11:32:35 阿俊

Golang 爬虫教程 | 解决反爬问题 | 做一个文明的爬虫

本文首发于 https://imagician.net/archives/93/ 。欢迎到我的博客 https://imagician.net/ 了解更多。 前排提示:本文是一个入门级教程,讲述基本的爬虫与服务器关系。诸如无头浏览器、js挖取等技术暂不讨论。 面对大大小小的爬虫应用,反爬是一个经久不衰的问题。网站会进行一些限制措施,以阻止简单的程序无脑的获取大量页面,这会对网站造成极大的请求压力。 要注意的是,本文在这里说的是,爬取公开的信息。比如,文章的标题,作者,发布时间。既不是隐私,也不是...阅读全文

Segmentfault 2020-04-23 13:32:34 zhshch

grpc 中的 stream(服务中的长连接,订阅,上传大数据等)

前言: 之前我们讲了 grpc 怎么简单的使用 ,这次讲讲 grpc 中的 stream,srteam 顾名思义 就是 一种 流,可以源源不断的 推送 数据,很适合 传输一些大数据,或者 服务端 和 客户端 长时间 数据交互,比如 客户端 可以向 服务端 订阅 一个数据,服务端 就 可以利用 stream ,源源不断地 推送数据。 stream的种类: 客户端推送 服务端 rpc GetStream (StreamReqData) returns (stream StreamResData){}...阅读全文

简书 2020-04-17 23:32:49 哆啦在这A梦在哪

OpenCensus 笔记

OpenCensus OpenCensus 项目是 Google 开源的一个用来收集和追踪应用指标的第三方库。 OpenCensus 能够提供了一套统一的测量工具:跨服务捕获跟踪跨度(span)、应用级别指标以及来自其他应用的元数据(例如日志)。 OpenCensus 有如下一些主要特点: 标准通信协议和一致的 API :用于处理 metric 和 trace 多语言库,包括Java,C++,Go,.Net,Python,PHP,Node.js,Erlang 和 Ruby 与 RPC 框架的集成...阅读全文

简书 2020-04-17 23:32:48 cc14514

Golang

12核心跑满计算质数 func main() { primes := []int{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,71,73,79,83,89,97} var limit = make(chan int , 12) m := sync.Mutex{} for i := 100; i < 10000000; i++ { limit <- i go func(i int) { p := true for j := 0;j < len...阅读全文

简书 2020-04-17 23:32:48 CAICAI0

golang goroutine_并发

并发:一箭多发 并行:同一时刻一起执行(齐头并进) 例子: package main import ( "fmt" "sync" ) // goroutine 多任务操作 var wg sync.WaitGroup // 声明一个全局的 wg 计数器对象[上下文管理器] (WaitGroup 结构体类型) func fun1(i int) { defer wg.Done() // 延迟调用,当次函数将要执行完毕时调用 fmt.Println(i) } func main() { for i :=...阅读全文

简书 2020-04-17 23:32:47 小麦客

golang sync.Once

package main // once 只执行一次,底层实现:应用互斥锁机制 import ( "sync" "fmt" ) var once sync.Once // 返回一个结构体指针类型 func fun1(endNum int) { res := 0 for i :=0; i <= endNum; i++ { res += i } fmt.Println("res:", res) } func main() { endNum := 100 // Do 函数接受一个无参数函数作为输入 o...阅读全文

简书 2020-04-17 23:32:46 小麦客

dockerfile自动构建镜像

首先手动制作一个镜像,然后写入到dockfile,启动一个镜像之后,最后测试 docker build -t centos6.9_nginx:v1 --network=host /opt/dockerfile/nginx/ #构建镜像 #--network=host 使用宿主机网络 docker run -it -p 80:80 centos6.9_nginx:v1 /bin/bash #创建容器测试 FROM 这个镜像的妈妈是谁?(指定基础镜像) MAINTAINER 告诉别人,谁负责养它?(...阅读全文

简书 2020-04-17 23:32:46 口口帅日日

Go语言的GPM调度器是什么?

????我是平也,这有一个专注Gopher技术成长的开源项目「go home」 导读 相信很多人都听说过Go语言天然支持高并发,原因是内部有协程(goroutine)加持,可以在一个进程中启动成千上万个协程。那么,它凭什么做到如此高的并发呢?那就需要先了解什么是并发模型。 并发模型 著名的C++专家Herb Sutter曾经说过“免费的午餐已经终结”。为了让代码运行的更快,单纯依靠更快的硬件已经无法得到满足,我们需要利用多核来挖掘并行的价值,而并发模型的目的就是来告诉你不同执行实体之间是如何协作...阅读全文

Segmentfault 2020-04-23 09:32:35 平也

go 函数 学习笔记

什么是函数有输入、输出,用来执行特定功能的代码块func functionnname([partmeternam type]) [return type] { // function body }函数的几种类型无参数返回值的函数有参数返回值的函数 defer 语句 1、无参数返回值的函数package main import "fmt" func functiontest1(a,b int) int { return a + b // 输出 15 } func main() { sum1 :=f...阅读全文

51CTO博客 2020-04-17 12:32:08 水滴石川1

golang实现的bitmap:缓存并快速判断一组数字型id的有效状态,可用于判断优惠码是否有效类似的业务

需求:有一些连续的id,几十万,要检查其是否存在,且把状态缓存在内存里面如何存储可以使占用的内存最少,如何快速判断id对应的状态可用于校验优惠码类似的业务bitmap.gopackage util import ( "strconv" ) type Bitmap struct { //按64*i取模后得到的值(i为数组元素下标) modValues []uint64 length int } func (bitmap *Bitmap) IsExist(nu...阅读全文

Go语言中文网 2020-04-17 18:19:38 yanglikai

KubesphereV2.1.1部署在Minikube-kubernetes集群上

1. 背景 想体验KubesphereV2.1.1版本部分功能 Kubesphere社区提供的在线DEMO环境比较简单,满足不了我想体验的功能 Kubesphere社区ks-installer安装工具相对较重 使用简单的kubernets部署yaml文件搭建一套最简Kubesphere环境(基本核心组件,不包括Jenkins/Monitor/Devops/Sonarqube等增值服务) 2. 环境说明 macos版本为:mojave-10.14 minikube版本为:v1.5.2 kubern...阅读全文

Segmentfault 2020-04-20 15:32:35 道九言

Go+GraphQL+React+Typescript搭建简书项目(四)——用户模块(后端)

项目地址:github 概述 这一节我们将实现用户的注册登录,以及关注的后台功能 定义用户模型 在model目录下新建user.go文件。我们将和user相关的结构体都定义在里面。 package model import "time" type Gender int const ( Man Gender = iota + 1 Woman Unknown ) type UserState int const ( Unsigned UserState = iota + 1 Normal Forbi...阅读全文

Segmentfault 2020-04-20 14:32:35 云燕

Go 每日一库之 plot

简介 本文介绍 Go 语言的一个非常强大、好用的绘图库——plot。plot内置了很多常用的组件,基本满足日常需求。同时,它也提供了定制化的接口,可以实现我们的个性化需求。plot主要用于将数据可视化,便于我们观察、比较。 快速使用 先安装: $ go get gonum.org/v1/plot/... 复制代码后使用: package main import ( "log" "math/rand" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" ...阅读全文

掘金 2020年04月16日 darjun

golang trace 的一个例子

今天,通过一个例子,一方面熟悉trace在自定义范围内的分析,另一方面golang 在协程调度策略上的浅析。 Show Code // trace_example.go package main import ( "context" "fmt" "os" "runtime" "runtime/trace" "sync" ) func main(){ // 为了看协程抢占,这里设置了一个cpu 跑 runtime.GOMAXPROCS(1) f, _ := os.Create("trace.dat...阅读全文

Segmentfault 2020-04-20 12:32:34 搬砖程序员带你飞

Golang 性能测试 (3) 协程追踪术

本文简单介绍 golang 如何做跟踪刨析。 简介 对于绝大部分服务,跟踪刨析是用不到的。但是如果遇到了下面问题,可以不妨一试: 怀疑哪个协程慢了 系统调用有问题 协程调度问题 (chan 交互、互斥锁、信号量等) 怀疑是 gc (Garbage-Collect) 影响了服务性能 网络阻塞 等等 坦白的讲,通过跟踪刨析可以看到每个协程在某一时刻在干什么。 做跟踪刨析,首先需要获取trace 数据。可以通过代码中插入trace, 或者上节提到的通过pprof 下载即可。 Example Code ...阅读全文

Segmentfault 2020-04-20 11:32:38 搬砖程序员带你飞