Go语言中文网 为您找到相关结果 2245

Golang的并发编程

golang是为并发而生的语言。优雅的并发编程范式,完善的并发支持,出色的并发性能是golang区别于其他语言的一大特色。并发的优势:1、并发能更客观地表现问题模型2、并发可以充分利用cpu核心的优势,提高程序的执行效率3、并发能充分利用cpu与其他硬件设备固有的异步性golang并发采用的协程,也是轻量级别线程,goroutine。而goroutine间通信方式是channel,我们可以使用channel在两个或者多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。这跟面向过程c语言处理多线程采用互斥锁写法不太一样的方式,更直接了当采用并发模式编程。select用来监控一系列的文件句...阅读全文

博文 2019-08-08 15:32:55 查灵

golang-类型变量

类型 变量 用var 定义变量,类型在前,变量名在后 var a uint32 var b bool var c,d int 直接使用简介模式 x := 10 y,z := "a", 123 常量 const关键字声明 const( x = 1 y = "SUCCESS" ) 枚举 枚举在golang中借助iota可以自增来处理,默认从0开始 中断iota需要显示恢复,并且后面继续按行自增 每个const出现时被重置为0,没出现一次iota,代表数字会自动+1 const( a = iota // 0 ) const ( xx = iota // 0 yy = 5 // 5 zz = iota // 2 ) 类型 布尔类型:bool 整形 int8 int16 int32 浮点类型 floa...阅读全文

博文 2019-08-20 22:02:39 码农苏羡的成长记

goroutine、channel原理

goroutine原理 概念介绍 并发 ⼀个CPU上能同时执⾏多项任务,在很短时间内,CPU来回切换任务执⾏(在某段很短时间内执⾏程序a,然后⼜迅速得切换到程序b去执⾏),有时间上的重叠(宏观上是同时的,微观仍是顺序执⾏),这样看起来多个任务像是同时执⾏,这就是并发。 并⾏ 当系统有多个CPU时,每个CPU同⼀时刻都运⾏任务,互不抢占⾃⼰所在的CPU资源,同时进⾏,称为并⾏。 进程 CPU在切换程序的时候,如果不保存上⼀个程序的状态(context--上下⽂),直接切换下⼀个程序,就会丢失上⼀个程序的⼀系列状态,于是引⼊了进程这个概念,⽤以划分好程序运⾏时所需要的资源。因此进程就是⼀个程序运⾏时候的所需要的基本资源单位(也可以说是程序运⾏的⼀个实体)。 线程 CPU切换多个进程的时候,会花费...阅读全文

博文 2020-05-28 21:32:44 强某某

Golang问题点(三) - Context的问题点

Go的标准库 context 在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。 那么如何控制goroutine优雅的退出呢? 1. 实例 1.0. 基础代码 package main import ( "fmt" "sync" "time" ) var wg sync.WaitGr...阅读全文

博文 2020-05-23 09:32:56 董小贱

golang 基础(30) WaitGroup

golang_real.jpg golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 func main(){ go foo() go bar() } func foo(){ for i := 0; i < 45; i++{ fmt.Println("Foo",i) } } func bar(){ for i := 0; i < 45; i++{ fmt.Println("Bar:",i) } } var wg sync.WaitGroup func...阅读全文

博文 2019-04-03 08:34:38 zidea

Can you help me figure out why some files are corrupted when downloading with http.Get?

<p>Hello, Basically I have a few hundred data entry that contain links to images that I want to queue up and download in parallel.</p> <p>However, I always end up with one of them being corrupted. My guess is that there&#39;s some flaw in my logic and maybe the last one in the queue is getting the hammer.</p> <p>...阅读全文

资源 2017-09-09 03:30:11 agolangf

Go Defer 高级实践

defer 是一个用起来非常简单的特性。它的实现原理也不复杂。本文主要介绍这个特性在实际项目中的利弊以及建议。 为什么要用 defer 任何一个特性都有它的设计初衷,主要是被用来解决什么问题的,任何一个特性也都有它合适和不合适出现的地方,我们清楚地了解并正确合理地使用,是非常重要的。 优势 提高安全性、健壮性 让代码更优雅 劣势 可读性、可维护性 (注意:用 defer 当然肯定比不用有一定的性能开销,但我们可以忽略,因为影响确实很小。 换句话说,绝大部分情况下,考虑是否使用 defer 时,性能开销不应该是首先考虑的因素。但是!如果你的代码是微秒级别的,那还是要评估后再使用) defer 怎么用 官方文档,告诉你 defer 的基本用法 几乎所有其他文章里说 defer 如何如何有坑,de...阅读全文

博文 2018-10-12 18:34:39 sxssxs

Golang和Erlang消息传递机制对比

上一篇文章介绍了 Go 和 Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制简要对比Erlang和Go虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erlang的轻量进程,Go的Goroutine), 并且都采用了消息传递的方式作为任务间交互的方式。在Erlang中,采用了一种比较纯粹的消息传递机制,进程间几乎没有任何形式的数据共享,只能通过彼此间发送消息进行通信; 而Go虽然是基于共享内存的,但是也必须通过消息传递来进行共享数据的同步。 可以说消息传递机制是两种语言任务间交互的首要方式。但是在具体实现中,鉴于两种语言的差异,也表现为不同的形式:在Erlang中,进程之间以彼此的Pid作为标识进行消息的发送,一切数据都仅可以消息的形式在进程间复制在Go...阅读全文

博文 2019-03-17 13:10:26 erlib

Go 通道

无缓冲区通道 通过make(chan xxx)创建,没有设置缓冲区大小,这种类型的通道会在两种情况下导致阻塞: 通道中无数据,但执行通道读操作。 执行通道写操作,但是无协程从通道中读取数据。 // 情况1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh println("read from no buffer channel success") } // 情况2 func WriteNoBufCh() { ch := make(chan int) ch <- 1 println("write success no block") } 有缓冲区通道 通过make(chan xxx, int)创建,并设置了缓冲...阅读全文

博文 2020-03-08 13:32:39 xiongkun01

Go goroutine理解

Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。 为了更好理解Goroutine,现讲一下线程和协程的概念 线程(Thread):有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一...阅读全文

golang-channel

缓冲的 chan, make(chan int, 缓冲大小): 表示满了 缓冲大小后 就开始堵塞,无法在往 管道 塞入数据 不带缓冲区 chan,make(chan int) : 就是放入数据之后,没有取出这个数据就无法在继续放入数据 cap(ch1) 可以查看缓冲区长度 len(ch1) 可以查看缓冲区有多少未读的缓存数据 例子一 package main import ( "fmt" "time" ) // 理念:不要通过共享内存来通信;通过通信来共享内存 /** channel 例子一 channel 既然有了发送方, 就必须要有接收方!!! */ func worker(c chan int) { for { // 从 channel 里面获取数据,赋值给 n n := <-c fm...阅读全文

golang 学习笔记 1.3 基本类型

1.3 基本类型 更明确的数字类型命名,支持 Unicode,支持常用数据结构。 常用数据结构 支持八进制、十六进制,以及科学记数法。标准库 math 定义了各数字类型取值范围。 a, b, c, d := 071, 0x1F, 1e9, math.MinInt16 空指针值 nil,而非 C/C++ NULL。 1.4 引用类型 引用类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。 内置函数 new 计算类型大小,为其分配 零值内存 ,返回指针。而 make 会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回 对象 而 非指针。 a := []int{0, 0, 0} // 提供初始化表达式。 a[1] = 10...阅读全文

博文 2019-03-22 05:34:41 Diogoxiang

Go语言基础(五)—— 并发编程

前言: 本专题用于记录自己(647)在Go语言方向的学习和积累。 系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。 目录如下: Go语言基础(一)—— 简介、环境配置、HelloWorld Go语言基础(二)—— 基本常用语法 Go语言基础(三)—— 面向对象编程 Go语言基础(四)—— 优质的容错处理 Go语言基础(五)—— 并发编程 Go语言基础(六)—— 测试、反射、Unsafe Go语言基础(七)—— 架构 & 常见任务 Go语言基础(八)—— 性能调优 本篇将介绍如下内容: 1.协程机制(Groutine) 2.共享内存并发机制(协程安全) 3.CSP并发机制(channel) 4.多路选择和超时控制(select) 5.channel的关闭和广播(channel) 6.任...阅读全文

博文 2020-03-10 10:34:30 奇舞647

golang中并发sync和channel

golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。 type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait()type Lockertype Mutex func (m *Mutex) Lock() func (m *Mu...阅读全文

博文 2018-08-17 15:30:02 williamjie

Concurrence

goroutine is the core of Go's concurrence package main import ( "fmt" "runtime") func say(s string) { for i := 0;i<5;i++{ runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello")} Here is the output // hello// world// hello// world// hello// world// hello// world// hello runtime.Gosched() means letting CPU give out the contro...阅读全文

博文 2018-10-24 01:34:38 曹小恒

Golang并发编程

Goroutine 在Go语言中,语言本身就已经实现和支持了并发, 我们只需要通过go关键字来开启goroutine即可。 gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。 上述代码就开启了1000个协程,在1ms内不断的打印字符串,这里需要注意两个点: time.Sleep 在main函数退出前,Sleep了1ms。这是因为当main函数退出时,之前开的协程也会随着退出,如果不Sleep,则无法看到打印信息。 匿名函数将变量i作为参数赋值传入。 如果不传参,变量i也能被使用,但是是以引用的方式。而i在main函数中在不断自增,导致在goroutine打印...阅读全文

博文 2019-06-24 20:02:44 千锋IT

Stopping a hanging call?

<p>Hello. Is there a way to have some call that hangs the system(like reading from a channel) stop if data hasn&#39;t been received in some time? Thank you.</p> <hr/>**评论:**<br/><br/>bastiaanvv: <pre><p>A very simple example on how to do this: <a href="https://play.golang.org/p/f4-pq0OQWvj" r...阅读全文

资源 2018-04-18 20:30:11 xuanbao

Golang 关于通道 Chan 详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/netdxy/article/details/54564436 首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数 funcmain(){ var i=...阅读全文

博文 2018-12-28 23:31:33 netdxy

[译] part 21: golang Goroutines

文地址:Part 21: Goroutines 原文作者:Naveen R 译者:咔叽咔叽 转载请注明出处。 在前面的教程中,我们讨论了并发以及它与并行的不同之处。在本教程中,我们将讨论如何使用Goroutines在 Go 中实现并发性。 什么是Goroutines Goroutines是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建Goroutine的成本很小。因此,Go 应用程序通常可以轻松运行数千个Goroutines。 Goroutines相较线程的优势 与线程相比,Goroutines非常轻量化。它们的堆栈大小只有几 kb,堆栈可以根据应用程序的需要而伸缩,而在线程的情况下,堆栈必须固定指定大小。 Goroutines被复用到较...阅读全文

博文 2019-04-02 00:34:38 咔叽咔叽_7647

golang并发编程tips

作为服务端的开发,最关注的就是并发编程,每个从java接触到golang的小伙伴应该都会有一些共同的困惑,做个总结 从java转到golang的一些类比: atomic.Value的用途和volatile类似 sync.Mutex、sync.RWMutex和ReentrantLock、ReentrantReadWriteLock类似 sync.WaitGroup和CountDownLauch类似 channel和future或者阻塞队列类似 sync.Map和ConcurrentHashMap类似 atomic包对应java的原子类 select特性没想到在java中有对应的东西,select加channel使用很广,配合default可以实现不阻塞,有很多妙用 sync.Once可以很方便...阅读全文

博文 2020-01-27 22:32:44 肥肥小浣熊

兄弟连区块链教程以太坊源码分析chain-indexer区块链索引一

chain_indexer 区块链索引 chain_indexer.go 源码解析 chain_indexer 顾名思义, 就是用来给区块链创建索引的功能。 之前在eth协议的时候,介绍过BloomIndexer的功能,其实BloomIndexer是chain_indexer的一个特殊的实现, 可以理解为派生类, 主要的功能其实实在chain_indexer这里面实现的。虽说是派生类,但是chain_indexer其实就只被BloomIndexer使用。也就是给区块链的布隆过滤器创建了索引,以便快速的响应用户的日志搜索功能。 下面就来分析这部分的代码。 数据结构 // ChainIndexerBackend defines the methods needed to process chai...阅读全文

博文 2018-10-19 10:34:39 兄弟连区块链培训

引用类型介绍

Golang的引用类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。 内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译 成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。 package main func main() { a := []int{0, 0, 0} // 提供初始化表达式。 a[1] = 10 b := make([]int, 3) // make slice b[1] = 10 c := new([]int) c[1] = 10 // ./main.go:11:3: invalid operation: c[1] (type *[]int does not s...阅读全文

博文 2019-02-21 01:34:44 weifansym

Go语言make与new区别

Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。new 和 make 都可以用来分配空间,初始化类型,但是它们确有不同。 一、new(T) 返回的是 T 的指针 new是一个用来分配内存的内建函数,但是与C++不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T)会为T类型的新项目,分配被置零的存储,并且返回它的地址,一个类型为*T的值。在Go的术语中,其返回一个指向新分配的类型为T的指针,这个指针指向的内容的值为零(zero value),但并不是指针为零。 p1 := new(int)//默认初始值为0 fmt.Printf("p1 --> %#v \n ", p1) //p1 --> (*int)(0xc00006...阅读全文

博文 2019-08-10 12:34:16 ChenQuan

兄弟连区块链入门教程以太坊源码分析event源码分析

兄弟连区块链入门教程以太坊源码分析event源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 event包实现了同一个进程内部的事件发布和订阅模式。## event.go目前这部分代码被标记为Deprecated,告知用户使用Feed这个对象。 不过在代码中任然有使用。 而且这部分的代码也不多。 就简单介绍一下。数据结构TypeMux是主要的使用。 subm记录了所有的订阅者。 可以看到每中类型都可以有很多的订阅者。 // TypeMuxEvent is a time-tagged notification pushed to subscribers....阅读全文

博文 2018-10-23 16:34:49 兄弟连区块链培训

Golang通道的无阻塞读写

无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一的解决办法,那就是使用select结构。 这篇文章会介绍,哪些情况会存在阻塞,以及如何使用select解决阻塞。 阻塞场景 阻塞场景共4个,有缓存和无缓冲各2个。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 // 场景1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh fmt.Println("read from no buffer channel success") // Output: /...阅读全文

博文 2018-11-02 15:34:43 shitaibin

Hyperledger fabri 部署网络(单机环境)

title: Hyperledger fabri 部署网络(单机环境) tags: Hyperledger, fabric ,Blockchain 安装预置环境 下载项目 首先我们需要配置好Hyperledger Fabric开发环境,然后下载并安装Hyperledger Fabric Samples。你会注意到fabric-samples文件夹中包含了许多示例。我们将使用first-network这个例子。 你如果你不知道环境配置和Samlpes的下载安装,可以看我之前的文章: https://blog.csdn.net/yang731227/article/details/83868333 使用脚本自动部署 Hyperledger Fabric Samples提供一个完全注释的脚本byf...阅读全文

博文 2019-03-18 01:34:40 Clown95

golang RabbiMQ简单操作

安装erlang 因为RabbitMQ是基于erlang开发的 安装RabbiMQ 上述步骤自行百度windows linux都支持 安装注意事项: erlang要和RabbiMQ版本对应上 RabbiMQ windows安装需要将.erlang.cookie改成一样的 rabbitMQ常用的命令 启动监控管理器:rabbitmq-plugins enable rabbitmq_management 关闭监控管理器:rabbitmq-plugins disable rabbitmq_management 启动rabbitmq:net start RabbitMQ 关闭rabbitmq:net stop RabbitMQ 查看所有的队列:rabbitmqctl list_queues 清除所有...阅读全文

golang学习笔记

golang对一个空channel(未初始化)的读取会永远阻塞,即使在其他goroutine中初始化了也没用死循环虽然不能切换goroutine, 但是可能触发golang生成新的线程,如果当前线程数未超过最大线程数的话,默认情况下最大线程数等于cpu逻辑数量(核数...阅读全文

博文 2020-02-06 17:32:46 海带丝阿飞

剥开比原看代码06:比原是如何把请求区块数据的信息发出去的

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇中,我们说到,当比原向其它节点请求区块数据时,BlockKeeper会发送一个BlockRequestMessage把需要的区块height告诉对方,并把该信息对应的二进制数据放入ProtocolReactor对应的sendQueue通道中,等待发送。而具体的发送细节,由于逻辑比较复杂,所以在前一篇中并未详解,放到本篇中。 由于sendQueue是一个通道,数据放进去后,到底是由谁在什么情况下取走并发送,BlockKeeper这边是不知道的。经过我们在代码中搜索,发现只有一个类型会直接...阅读全文

博文 2018-07-23 15:34:50 比原链Bytom

剖析nsq消息队列(三) 消息传输的可靠性和持久化[二]diskqueue

剖析nsq消息队列-目录 上一篇主要说了一下nsq是如何保证消息被消费端成功消费,大概提了一下消息的持久化,--mem-queue-size 设置为 0,所有的消息将会存储到磁盘。 总有人说nsq的持久化问题,消除疑虑的方法就是阅读原码做benchmark测试,个人感觉nsq还是很靠谱的。 nsq自己实现了一个先进先出的消息文件队列go-diskqueue是把消息保存到本地文件内,很值得分析一下他的实现过程。 整体处理逻辑 go-diskqueue 会启动一个gorouting进行读写数据也就是方法ioLoop 会根据你设置的参数来进行数据的读写,流程图如下 evernotecid://D2602A6B-6F53-4199-885D-97DFC21CBA3E/appyinxiangcom/2...阅读全文

博文 2019-11-15 18:04:17 li_peng

2018-12-02

线程模型 内核级线程模型(KSE(Kernel Scheduling Entity)) 关键点: 完全靠操作系统调度 每一个用户线程绑定一个实际的内核线程,而线程的调度则完全交付给操作系统内核去做,应用程序对线程的创建、终止以及同步都基于内核提供的系统调用来完成 用户级线程模型 关键点: 完全靠自己调度 用户线程与内核线程KSE是多对一(N : 1)的映射模型,多个用户线程的一般从属于 单个进程 的调度是由用户自己的线程库来完成,线程的创建、销毁以及多线程之间的协调等操作都是由用户自己的线程库来负责而无须借助系统调用来实现。操作系统只知道用户进程而对其中的线程是无感知的,内核的所有调度都是基于用户进程。 两级(混合型)线程模型 关键点: 自身调度与系统调度协同工作 用户线程与内核KSE是多对...阅读全文

博文 2018-12-02 14:34:41 不喜欢夜雨天

go-channel初识

了解过go的都知道,go最为突出的优点就是它天然支持高并发,但是所有高并发情况都面临着一个很明显的问题,就是并发的多线程或多协程之间如何通信,而channel就是go中goroutine通信的‘管道’。 channel在go中时如何使用的 package main import ( "fmt" "os" "os/signal" "syscall" "time" ) var exit = make(chan string, 1) func main() { go dealSignal() exited := make(chan struct{}, 1) go channel1(exited) count := 0 t := time.Tick(time.Second) Loop: for { ...阅读全文

博文 2020-03-17 05:32:45 GGBond_8488