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

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

兄弟连区块链入门教程以太坊源码分析ethdb源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。go-ethereum所有的数据存储在levelDB这个Google开源的KeyValue文件数据库中,整个区块链的所有数据都存储在一个levelDB的数据库中,levelDB支持按照文件大小切分文件的功能,所以我们看到的区块链的数据都是一个一个小文件,其实这些小文件都是一个同一个levelDB实例。这里简单的看下levelDB的go封装代码。 levelDB官方网站介绍的特点 特点: key和value都是任意长度的字节数组; entry(即一条K-V记录)默...阅读全文

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

Golang和Erlang的并发调度浅析

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 coroutine(只需要切换PC和栈帧,其他寄存器由函数调用者负责保存); 而在 Go 的 GCC 前端中,Goroutine 则直接由C库的 coroutine 机制实现。由于 Erlang 是基于 BEAM 虚拟机执行的,因此它的所谓 “轻量进程” 也就仅仅是 BEAM 上的概念,不对应C语言或OS...阅读全文

博文 2019-03-17 13:09:33 erlib

Golang和Erlang的IO调度浅析

之前关于调度器的对比分析的文章,在结束时遗留了一些问题:当系统出现高并发的IO访问时,如一个网络服务器通常要并发处理成百上千的链接,每个链接可能都是由一个用户任务执行的,那么将会出现大量阻塞的IO操作,如果为每个阻塞操作都单独分配一个OS线程,那么系统很容易就会退化成多OS线程的系统,轻量任务的优势将无从谈起。本文试图回答这个问题,通过分析Go和Erlang对于IO、特别是网络IO的优化机制,了解其对调度器乃至整个系统性能的影响。Go的IO优化机制 —— netpoller由于Go是一门主要面向互联网环境的分布式语言,相对于一般的IO,如文件读写等,网络IO的并发性能更加重要。对于一般IO,Go的处理方式就是按上篇所说的,将执行Syscall的OS线程剥离。通常应用场景下,不会出现大量并发G...阅读全文

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

并发简介

有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。 Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。 下面来介绍几个概念: 进程/线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 线程是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。 并发/并行 多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。 并发...阅读全文

博文 2020-03-25 23:32:49 乔大叶_803e

《Go语言程序设计》读书笔记(六) 基于共享变量的并发

竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前?之后?还是同时发生?是没法判断的。当我们没有办法确认一个事件是在另一个事件的前面还是后面发生的话,就说明x和y这两个事件是并发的。 一个函数在线性程序中可以正确地工作。如果在并发的情况下,这个函数依然可以正确地工作的话,那么我们就说这个函数是并发安全的,并发安全的函数不需要额外的同步工作。我们可以把这个概念概括为一个特定类型的一些方法和操作函数,如果这个类型是并发安全的话,那么所有它的访问方法和操...阅读全文

博文 2020-01-04 12:32:41 Kevin

并发控制

1 c++中的锁和条件变量实现状态同步 #include #include #include #include #include #include using std::vector; using std::string; using std::queue; using std::mutex; using std::thread; class Message { public: void Put(const string& msg) { std::lock_guard guard(msgs_lock_); msgs_.push(msg); } bool Get(...阅读全文

博文 2020-06-06 18:32:46 小跑001

假期笔记

不能盲目优化 一是在追求速度的时候抓不住重点。比如在没有一个完善的测量系统不知道瓶颈在哪就开始优化,花了一个多月软件提高了半个毫秒结果发现别人一个网络改动一下省10毫秒。小公司在进行大优化之前不估算投入产出比,耗费大量软硬件开发资源做对策略影响不大的改进。比如没弄清楚情况自己策略情况就强行上FPGA团队的。 虚拟语气 couldn't agree more,表示十分同意。 can't agree anymore表示十分同意是错误的,字面意思是,不能再继续同意下去了。 并发编程模型 共享数据,加锁 如c和java的并发编程。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争(data race)。处理各种锁的问题是让人十分头痛的一件事。 消息传递 消息传递机制最大的优点就是不会产生...阅读全文

博文 2020-02-27 07:32:41 sunboximeng

24. 理解 Go 语言中的协程:goroutine

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 说到Go语言,很多没接触过它的人,对它的第一印象,一定是它从语言层面天生支持并发,非常方便,让开发者能快速写出高性能且易于理解的程序。 在 Python (为Py为例,主要是我比较熟悉,其他主流编程语言也类似)中,并发编程的门槛并不低,你要学习多进程,多线程,还要掌握各种支持并发的库 asyn...阅读全文

博文 2020-06-01 11:34:41 王一白

Go 小知识之 Go 中如何使用 set

今天来聊一下 Go 如何使用 set,本文将会涉及 set 和 bitset 两种数据结构。 Go 的数据结构 Go 内置的数据结构并不多。工作中,我们最常用的两种数据结构分别是 slice 和 map,即切片和映射。 其实,Go 中也有数组,切片的底层就是数组,只不过因为切片的存在,我们平时很少使用它。 除了 Go 内置的数据结构,还有一些数据结构是由 Go 的官方 container 包提供,如 heap 堆、list 双向链表和ring 回环链表。但今天我们不讲它们,这些数据结构,对于熟手来说,看看文档就会使用了。 我们今天将来聊的是 set 和 bitset。据我所知,其他一些语言,比如 Java,是有这两种数据结构。但 Go 当前还没有以任何形式提供。 实现思路 先来看一篇文章,访...阅读全文

博文 2019-08-01 09:32:40 波罗学

golang 源码剖析(2) TCMalloc内存管理器

使用TCMalloc(Thread-Caching Malloc)当内存管理器 以下翻译自tcmalloc.html 动机 相对于glibc2.3 malloc, 在2.8GHz P4上,ptmalloc2需要大概300ns执行一个malloc/free 操作,TCMalloc只需要50ns 多线程时,可减少锁竞争. 小对象基本都是无锁,对于大对象,ptmalloc2也使用每个线程一个arena,但是在不同的arena上分配大对象时内存不会复用而会重新去申请内存 TCMalloc在小对象上也是空间高效的,对N个8字节对象只需要N81.01bytes,而ptmalloc2每个对象使用4字节头,也就是12字节,对齐到8字节的倍数,从而使用了16N个字节 预览 TCMalloc为每个线程分配一个线...阅读全文

博文 2020-03-04 10:32:47 darcyaf

调度相关的重要数据结构

声明 下面的分析均基于Golang1.14版本。 以下数据结构均做了裁剪,只留了部分调度密切相关的重要结构。 一、G的定义 裁剪了大部分字段,后面填坑把其它字段的作用及用途整理。 type g struct { stack stack // offset known to runtime/cgo G的栈信息含栈的起始和终止地址 m *m // current m; offset known to arm liblink 运行时绑定的M sched gobuf // 运行时的上下文 goid int64 // g id 唯一的标识id } type stack struct { lo uintptr hi uintptr } type gobuf struct { sp uintptr // ...阅读全文

博文 2020-05-11 07:32:41 不争_900c

24. 理解 Go 语言中的协程:goroutine

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 说到Go语言,很多没接触过它的人,对它的第一印象,一定是它从语言层面天生支持并发,非常方便,让开发者能快速写出高性能且易于理解的程序。 在 Python (为Py为例,主要是我比较熟悉,其他主流编程语言也类似)中,并发编程的门槛并不低,你要学习多进程,多线程,还要掌握各种支持并发的...阅读全文

博文 2020-06-01 08:33:29 Python编程时光

通俗易懂:说说 Python 里的线程安全、原子操作

首发于微信公众号:Python编程时光 在线博客地址:python.iswbm.com/en/latest/c… 在并发编程时,如果多个线程访问同一资源,我们需要保证访问的时候不会产生冲突,数据修改不会发生错误,这就是我们常说的 线程安全 。 那什么情况下,访问数据时是安全的?什么情况下,访问数据是不安全的?如何知道你的代码是否线程安全?要如何访问数据才能保证数据的安全? 本篇文章会一一回答你的问题。 1. 线程不安全是怎样的? 要搞清楚什么是线程安全,就要先了解线程不安全是什么样的。 比如下面这段代码,开启两个线程,对全局变量 number 各自增 10万次,每次自增 1。 from threading import Thread, Lock number = 0 def target()...阅读全文

博文 2020-05-14 19:34:39 王一白

Go语言入门(七)goroutine和channel

goroutine和channel goroutine 多线程 func hello() { //fmt.Printf("Hello Goroutine!!\n") for i:=0;i<100;i++ { fmt.Printf("hello:%d\n",i) time.Sleep(time.Millisecond) } } func main() { go hello() //启动了一个独立的线程,使其与下面的代码交替执行,使之成为一个多线程 //fmt.Printf("main function\n") for i:=0;i<100;i++ { fmt.Printf("main:%d\n",i) time.Sleep(time.Millisecond) } time.Sleep(time...阅读全文

博文 2020-03-30 20:33:16 wx5b285b48ed74e

通俗易懂:说说 Python 里的线程安全、原子操作

首发于微信公众号:Python编程时光在线博客地址:http://python.iswbm.com/en/la... 在并发编程时,如果多个线程访问同一资源,我们需要保证访问的时候不会产生冲突,数据修改不会发生错误,这就是我们常说的 线程安全 。 那什么情况下,访问数据时是安全的?什么情况下,访问数据是不安全的?如何知道你的代码是否线程安全?要如何访问数据才能保证数据的安全? 本篇文章会一一回答你的问题。 1. 线程不安全是怎样的? 要搞清楚什么是线程安全,就要先了解线程不安全是什么样的。 比如下面这段代码,开启两个线程,对全局变量 number 各自增 10万次,每次自增 1。 from threading import Thread, Lock number = 0 def target...阅读全文

博文 2020-05-14 18:33:13 Python编程时光