go 协程的实现笔记

看到有一篇写得很清楚的博客,做个笔记。 原文在此:Golang源码探索(二) 协程的实现原理 有时候G需要调用一些无法避免阻塞的原生代码, 这时M会释放持有的P并进入阻塞状态, 其他M会取得这个P并继续运行队列中的G. 因为同一时间只有一个线程(M)可以拥有P, P中的数据都是锁自由(lock free)的, 读写这些数据的效率会非常的高. 自旋中(spinning)这个状态非常重要, 是否需要唤醒或者创建新的M取决于当前自旋中的M的数量. 本地运行队列有数量限制, 当数量达到256个时会入队到...阅读全文

简书 2020-07-14 22:32:44 yellowone

golang主流高性能web框架性能测试

测试目的 由于K8s缘故涉猎go语言,发现golang的web框架很多,都号称高性能标杆;之前一直致力于c++高性能服务端框架研究,出于好奇,想单从性能层面客观比较一下go的众多web框架,另一方面也希望看看c++的实现与go语言实现之间究竟存在多大差异。 高性能服务框架评估指标很多,但一般来讲吞吐量与QPS是关键考量指标,吞吐量衡量带宽利用率,QPS主要考验框架调度性能(几乎所有可称之为“高性能”的服务框架都没有吞吐量问题,毕竟网络瓶颈很轻易就达到了)。由于是框架本身QPS测试,为了屏蔽htt...阅读全文

Segmentfault 2020-07-21 09:32:32 用户9276672309

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢? 问题 for循环select时,如果通道已经关闭会怎么样?如果select中的case只有一个,又会怎么样? 怎么答 for循环select时,如果其中一个case通道已经关闭,则每次都会执行到这个case。如果select里边只有一个case,而这个case被关闭了,则会出现死循环。 解释 1.for循环里被关闭的通道 c通道是一个缓冲为0的通道,在main开始时,启动一个协程对c通道...阅读全文

掘金 2020年07月14日 9號同学

线上Go项目的Docker镜像应该怎么构建?

上期的文章:Kubernetes入门实践--部署运行Go项目发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。 Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占太多篇幅。 确实真实线上项目的应用镜像一般都不像之前文章里讲那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先...阅读全文

掘金 2020年07月14日 kevinyan

线上Go项目的Docker镜像应该怎么构建?

上期的文章:Kubernetes入门实践--部署运行Go项目发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。 Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占太多篇幅。 确实真实线上项目的应用镜像一般都不像之前文章里讲那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先...阅读全文

Segmentfault 2020-07-20 09:32:32 Kevin

golang 设置程序图标

在 Windows上每次build出来的程序图标,都是Windows的默认图标,贼拉丑 给我们的程序配上一个好看的图标,为啥不给Linux配? 因为服务器多是文本界面的命令行 你配置上去也不会显示,哈哈哈 第一步: 建立一个 后缀为 .manifest 的文件, 本示例使用ico.manifest,写入内容 下面的内容为通用内容,直接复制就好,啥都不用改 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns...阅读全文

简书 2020-07-14 07:32:56 一玖玖肆

本地环境进行https测试

使用openssl生成密钥privkey.pem: openssl genrsa -out privkey.pem 1024/2038 使用密钥生成证书server.pem: openssl req -new -x509 -key privkey.pem -out server.pem -days 365 证书信息可以随便填或者留空,只有Common Name要根据你的域名填写。 我输入的是 *.helailiang.com image.png 3.启用https服务 (golang) log....阅读全文

简书 2020-07-14 07:32:56 亮子_a8be

使用 PDXBaap/go-std-ext 让 go 直接生成 ECC secp256k1 密钥和 x509 证书

说明 目前 golang crypto/x509 这个库针对 ECC 的密钥只支持 P224 / P256 / P384 / P521 这四条曲线, 区块链开发通常使用 secp256k1 曲线,也不只是 golang 不支持这条曲线,貌似目前能够直接支持使用 这条曲线生成密钥和数字证书的就只有 libssl.so 这个库,当我们想要为 secp256k1 密钥签发证书时可以选择在 go 中引用 libssl.so 也可以选择直接使用 openssl ,本例提供了更为优雅的第三种选择,使用 PD...阅读全文

简书 2020-07-14 07:32:55 cc14514

选型必看:RabbitMQ 七战 Kafka,差异立现

作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。 不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力。 这篇文章会先介绍RabbitMQ和Apache Kafka内部实现的相关概念。紧接着会主要介绍这两种技术的主要不同点以及他们各自的优缺点,...阅读全文

简书 2020-07-14 07:32:55 老罗带你玩Java

记录最近的几次面试(PHP)

记录一下最近碰到的比较盲点的面试题。公司都不算大,所以只挑出一些技术性比较强的问题做记录。 PHP 基础相关: PHP 编译的过程?对 opcode 有没有了解?从 opcode 的角度出发,能否优化一下 php 的速度? PHP 变量底层是如何实现的? Nginx 与 php-fpm 的通信过程?Nginx 监听端口和socket 方式,有何区别? php-fpm 是怎么调用 PHP 代码的? PHP 是如何连接 MySQL 的?连接池是如何实现的? 谈下 PHP 和 Golang 的区别 S...阅读全文

简书 2020-07-14 07:32:50 如梦又似幻

编程入门必看:带你零基础了解编程和编程语言,入门应该学什么?

编程入门 什么是编程我们通过有固定格式和固定词汇的“语言”来控制他人,让他人为我们做事情。语言有很多种,包括汉语、英语、法语、韩语等,虽然他们的词汇和格式都不一样,但是可以达到同样的目的,我们可以选择任意一种语言去控制他人。 同样,我们也可以通过”语言“来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming Language)。编程语言也有固定的格式和词汇,我们必须经过学习才会使用,才能控制计算机。总结:编程语言是用来控制计算机的一系列指令(Instruction)...阅读全文

简书 2020-07-14 07:32:49 老师_

深入Golang调度器之GMP模型

Go语言虽然使用一个Go关键字即可实现并发编程,但Goroutine被调度到后端之后,具体的实现比较复杂。先看看调度器有哪几部分组成。1、GG是Goroutine的缩写,相当于操作系统中的进程控制块,在这里就是Goroutine的控制结构,是对Goroutine的抽象。其中包括执行的函数指令及参数;G保存的任务对象;线程上下文切换,现场保护和现场恢复需要的寄存器(SP、IP)等信息。Go不同版本Goroutine默认栈大小不同。// Go1.11版本默认stack大小为2KB_StackMin ...阅读全文

简书 2020-07-14 07:32:40 我爱张智容

使用golang实现类型通用的orm层工具类

**背景:** 小弟是golang的初学者、为了简化一下其他同事查询mysql的复杂程序、想实现一个通用查询sql函数 **大体想法:** 使用者创建一个和sql 查询字段相对应的结构体 ``` type myType sturct{ id string name string }//结果类型 results,err:= commonFun(myType)//通用查询函数调用,参数可以传入类型 、或是该类型的对象、 返回的results是 myType类型的结果...阅读全文

Go语言中文网 2020-07-13 20:31:27 zm_2019

ARTS 第9周 LeetCode 378 二分法 | 面向对象三要素你还记得吗?

ARTS ARTS 是陈浩(网名左耳朵耗子)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。 每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。 本周内容 本周你将看到: 二分查找类型题能还难到什么程度? 本周没有文章推荐; 本周也没有技巧可讲; 你真的在践行面向对象编程么? Algorithm 本周的算法题是两道比较「高级」的二分查找题目: LeetCode 3...阅读全文

Segmentfault 2020-07-18 12:32:32 casmo澎湃哥

go闭坑指南

内容 1 切片与数组 2 defer 3 make与new 4 方法与函数 1 切片和数组 数组和结构体都是值变量,即:如果把一个数组变量和结构体变量赋值给另外的变量,是拷贝了一份值,两者的修改互不影响; 2 . go通过切片生成另外一个切片时,两个切片共享同一个底层数组,对其中一个修改元素时,两个都会改变; 例如: a=[]int{1,2,3} b:=a[:] b[0] = 2 printLn(a[0]) —》输出:2 特别注意初始化切片时,如果指定了切片的长度,go会用nil来填充这个切片,...阅读全文

简书 2020-07-13 06:32:47 酷酷码农

Golang学习笔记-defer关键字学习

defer学习 很多现代的变成语言中都会有defer关键字,Go语言的defer会在当前函数或是方法返回之前执行传入的函数,它会经常被用于 关闭文件描述符,关闭数据库链接和解锁资源。 作为一个编程语言中的关键字,defer 的实现一定是由编译器和运行时共同完成的, 不过在深入源码分析它的实现之前我们还是需要了解 defer 关键字的常见使用场景以及使用时的注意事项。 使用defer的最常见的场景就是在函数调用结束的时候完成一些收尾工作,比如在defer中回滚数据库 func createPost...阅读全文

简书 2020-07-13 06:32:47 LegendGo