关于Go 和Erlang的一些想法

为什么我要选择erlang+go进行服务器架构(2) 原创文章,转载请注明出处:服务器非业余研究-sunface 为什么我要选择Erlang呢?       一、erlang特别适合中小团队创业:        erlang有异常成熟、经过电信级别大规模验证的OTP应用库,只需要很简单的代码就能建立起异常稳定、容错性强、扩展性强、高并发的服务器框架,这也是erlang最宝贵的核心价值所在。       二、erlang是天生的并发语言: 阅读详情

关于Go 和Erlang的一些想法

原文链接:http://blog.erlware.org/some-thoughts-on-go-and-erlang/
以下为本人翻译,仅用于交流学习,版权归原作者所有,转载请注明出处,请不要用于商业用途。

更新: 我发现我这篇文章没有把观点说明白。我并不是说Go不行或者应该改进,因为它跟Erlang是不一样的。我想说的是在可用性和低延迟不可缺少的高并发后端领域来说,Go仍然不能替代Erlang。 需要注意的是,我写这篇文章并不是要关于某一种语言比如Julia。我听说不仅仅在新项目里,还有在一些老项目要替换新语言里,Go慢慢成了Erlang的替代者。没有人说Julia也是这样,但是Go和Node.js却被一些人看作是Erlang的友好的替代者。Erlang并不是适合所有,这里我只明确讨论Erlang适合的地方和Go不适合的地方。
我打算去掉我的一些关于不喜爱Go的主观言论,比如语法或者或者缺少模式匹配,并且会解释这门语言的本身以及某些系统下它的运行时并不适合的客观原因。

Go的长处

客户端

正如Rob Pike曾经说过的,他最大的惊讶是Go吸引了很多Python和Ruby程序员转向它而不是C++。对我来说,这种趋势也很乐意看到。用pip或者gems安装的那些慢的客户端也不会再出现了 (尽管有一些用Node.js做客户端的越来越多的原因, 卧槽那Keybase呢)。
GO为开发者提供了一种快速的,易于使用的带有垃圾收集和并发原语的高级静态类型语言。因为这些优点,C++开发者转向Go是容易的,在我机器上经常崩溃的程序Hipchat 和 Spotify,就是用C++写的,它就擅长不恰当的使用内存。不过Rob Pike指出C++开发者却不想使用这个简单而又强大的Go。而Ruby和Python程序员却愿意转向Go。

工具

不基于第三方工具,只基于第三方库,编译可执行过程能很容易完成,这是Go的长处。虽然这工具并不完美,但有一些工具能填补这些缺点,比如Godep,对于这门语言来说,是一个巨大的进步。

Go的缺点

在编写低延迟的容错系统中,一些Go的设计是有缺陷的。

并发

是的,在第一部分的附加部分,我提到了并发原语,正是这个原因,很多客户端下Go代替了Ruby,python或者C++。但是在需要容错的复杂的后端系统中,Go和其他语言一样在共享状态方面并不适合。

抢占调度

这方面Go就好多了。Go的抢占调度是通过系统调完成的,但是现在在每个函数调用中,一个goroutine检查栈的时候抢占调度也会发生。如果这个goroutine运行了很长时间,它有可能被标记为失败(引起抢占调度) 。尽管这是个改进,但是它仍然落后Erlang的计数减少和后来为了改进C而新加入其中的脏调度。

垃圾收集

Go中的垃圾收集是全局标记和清除式的。这会在清除阶段暂停所有goroutines,这对于低延迟来说是糟糕的。而且,低延迟很困难,运行时做得越多,对来你说越好。

错误处理

这里不是要讨论如果第二个返回值是nil的话没有异常或者异常检查的用法。Goroutine没有身份标识意味着Go缺少了连接和监控goroutines的能力。没有连接(被panic和defer代替)以及没有进程隔离意味着你在稳定状态下无法在崩溃的时候回退和重启。这样会导致产品里有很多bug,而且其中很多都是海森堡bug,所以能够使进程之间互相隔离但是要基于他们的依赖,是能容错的关键。
另外在错误处理上Go有nil,它在2014年被认为是可行的,但是我却不认同,不过我先不管这些,先看看再说。

反省

在开发的时候没有REPL是很烦的,而没有远程shell对于一个正在运行的系统而言却是一个致命伤。Erlang有一个令人印象深刻的tracing功能,以及基于这种功能的工具如recon trace。Erlang的自我内省极大的改善了开发,同时也改善了在复杂的系统上的维护。

静态连接

是的,一件事情本来是好的但是却变成了不好的,比如在一个系统上要花很多时间运行。虽然没有连接会导致执行变慢,但是在运行的系统上进行代码替换方面它却给了Erlang一个优点。很重要的一点,由于Erlang的调度和垃圾收集策略,各种速度的权衡并不意味着在同一个应用中Erlang会比其他语言慢,尤其是仅有Erlang在运行的情况下。

代码组织

OTP框架为通用模式提供了库。OTP不仅可以用更少更优的抽象代码去写程序而且能提高可读性。随着应用里加入了OTP标准,上级和普通员工(genserver, genfsm, gen_event)意味着一个新的开发人员通过进程树能够很快的胜任工作以及如何沟通交互。Go的channels,不可识别的goroutines以及缺少模式去分隔goroutines到不同的模块将导致代码越来越难写。

Go应该改变吗,能改变吗?

Erlang已经出现了数十年了,而Go还是个新孩子,那么Go能否在这些领域改进呢?也许有的可以,但是更多的是不可以,因为这门语言本身缺乏容错和低延迟。
这并不是说Go就是不好的或者错误的,跟其他类似Erlang语言相比,它能在不同的问题处理上做出不同的更合适的选择。

dirty_scheduler:R17.3 +的Erlang脏调度程序示例 dirty_scheduler 不要忘记使用“ --enable-dirty-schedulers”标志来构建您的OTP。 使用erlang:system_info(dirty_cpu_schedulers_online)进行检查。 如果未启用它们,它将返回badarg。 您可以使用以下方法检查您的呼叫是否正在肮脏的调度程序上处理:if(enif_is_on_dirty_scheduler(hp)){// hp是ErlNifEnv} 从Erlang 17.03开始,enif_schedule_dirty_nif,enif_schedule_dirty_nif_finalizer和enif_dirty_nif_finalizer被删除(erl_nif.h)。 更多信息: : 立即下载

相关推荐

UE4 GamePlay框架深度解析:从蓝图到C++构建多人游戏核心

在游戏开发与实时交互应用领域,一套清晰、可扩展的底层框架是项目成功的关键。GamePlay框架作为虚幻引擎(UE4/UE5)的核心架构,定义了游戏世界中对象交互、状态管理与网络同步的基本原理。它通过职责分离的设计模式,将游戏规则(GameMode)、全局状态(GameState)、玩家状态(PlayerState)、可操控实体(Pawn/Character)及其控制器(Controller)等核心类有机组织起来,确保了逻辑的清晰性与多人游戏数据的一致性。其技术价值在于为开发者提供了一套经过验证的最佳实践,大

weixin_33924770的博客 620

Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题。本文首先简单介绍脏调度器机制的用法,然后简要分析虚拟机中的实现原理,最后讨论了一下脏调度器的局限性。 脏调度器机制的用法 了解 NIF 的同学都知道,在 Erlang 虚拟机的层面,NIF 调用是不会被抢占的,在执行 NIF 的...

325

从零到一:Mx_yolo本地训练与K210部署实战指南

本文详细介绍了从零开始进行Mx_yolo本地模型训练到K210部署的全流程实战指南。涵盖环境配置、数据准备、模型训练与调优、模型转换及K210部署等关键步骤,并提供了常见问题解决方案和性能优化技巧,帮助开发者高效完成AI模型在嵌入式设备的落地应用。

weixin_29081163的博客 252

erlang 脏调度器支持

# dirty shceduler ##简介 在 Erlang 虚拟机的层面,NIF 调用是不会被抢占的,因此运行时间过长的 NIF 会影响其所在的调度器上的所有其他进程的调度。erlang R17引入脏调度器一定程度上解决了这个问题。 脏调度器本质上和普通调度器是一样的,也是运行在虚拟机中的调度器线程,但是这种调度器专门运行长时运行的 NIF,R17允许将长时运行的NIF直接丢到脏调度器上...

luo222的专栏 923

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1223

避坑指南:DeepSeek Function calling流式输出中的常见问题与解决方案

本文深入探讨了在DeepSeek Function Calling中实现流式输出时常见的参数拼接、函数依赖管理和错误处理等核心挑战。针对流式响应中参数碎片化的问题,提供了健壮的参数拼接方案与状态管理策略。同时,文章详细阐述了如何管理函数调用顺序、处理条件性执行,并构建了分阶段的错误处理与重试机制,旨在帮助开发者构建稳定、高效的流式AI应用。

weixin_29062671的博客 203

Golang和Erlang的并发调度浅析

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 cor

Sunface撩技术 7673

继电器管理策略(二)

介绍了电池管理系统中的继电器管理,包含控制和诊断

manjixingkong1234的专栏 419

Erlang调度器的一些细节以及它重要的原因(译文)

嗯,简单总结了Erlang调度器的原理和发展

山城的博客 2706

BPC坏点矫正

whatis the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系。表现为暗态常亮,亮态常暗。 坏点分类:静态坏点:亮坏点,暗坏点。 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor ...

camerall 1万+

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 477

Erlang和Golang的几点比较

顺便说一下, 最早这篇文章发布在豆瓣上, 原作者是我。 我最早使用的语言是Java和Python, 并且一直都对Python充满好感, 我喜欢这种很朴实和高效率的感觉, 但我却最后没有采用Python,原因其实也很简单, 我就是不喜欢缩进语法, 就跟很多人换工作仅仅是为了屏幕更大一点一样, 另外就是有了同样很棒的可选方案, 这就是Ruby, 所以我最终采用了Ruby作为主力编程语言, 同样也...

SharpKit 2801

Winform中使用EasyPlayer-RTSP-Win开源组件实现播放RTSP视频流

场景 开源RTMP组件EasyPusher-Android+EasyDarwin实现APP推流给RTSP流媒体服务器: 开源RTMP组件EasyPusher-Android+EasyDarwin实现APP推流给RTSP流媒体服务器_BADAO_LIUMANG_QIZHI的博客-优快云博客 上面介绍了RTSP相关的开源组件,如果要在Windows中实现对RTSP视频流的播放, 可以使用开源组件EasyPlayer-RTSP-Win GitHub - tsingsee/EasyPlayer-RTSP

BADAO_LIUMANG_QIZHI的博客 1万+

Erlang和Golang区别

转载:https://blog.youkuaiyun.com/kwame211/article/details/79085186

qq_37756473的博客 2352

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于 许式伟谈Go Erlang并发编程差异

写在开头: 这篇文章是ECUG2014年七牛CEO许式伟的演讲稿。这篇文章很详细的分析了Go和 Erlang在实现并发编程的差异,但是有些内容可能因为作者本人个人情感的一些原因有些出入导致了知乎上的一些讨论,http://www.zhihu.com/question/27465406,这种讨论甚至激烈的争辩是无法避免的,因为捍卫者需要站出来维护他们正在使用的兵器。关于这种争辩,在其他编程领域也有

挑灯看剑的专栏 4507

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Go/Python/Erlang编程语言对比分析及示例

本文主要是介绍Go,从语言对比分析的角度切入。之所以选择与Python、Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉。Go的很多语言特性借鉴与它的三个祖先:C,Pascal和CSP。Go的语法、数据类型、控制流等继承于C,Go的包、面对对象等思想来源于Pascal分支,而Go最大的语言特色,基于管道通信的协程并发模型,则借鉴于CSP分支。

2401_86940371的博客 2639

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用GO实现的erlang的genfsm.

关于erlang的有限状态机,参考

sll1983的专栏 1502

[ZZ]Erlang和Golang的几点粗浅的比较

周六应hoterran之邀,让我吐槽一下Erlang和Go,所以趁周日就随便喷几句,先做个Golang的广告: Golang Online QQ群: 259718627 我最早使用的语言是Java和Python, 并且一直都对Python充满好感, 我喜欢这种很朴实和高效率的感觉, 但我却最后没有采用Python,原因其实也很简单, 我就是不喜欢缩进语法, 就跟很多人换工作仅仅是为了屏幕更大一点

bbeikke在优快云的技术博客 4787

Golang与Erlang有什么差异

相反,Erlang的程序运行在虚拟机(BEAM)上。Erlang的虚拟机能够动态加载代码,支持系统在不停机的情况下更新和升级,适合构建需要长时间运行和高可靠性的系统。其出色的并发支持、性能优势和易学易用的特点使得Golang成为构建高性能、可扩展和易维护的系统的首选语言。总而言之,Golang和Erlang在并发模型、运行环境、函数式编程和领域特性等方面存在明显的差异。下面我将简单的探讨一下Golang和Erlang之间的差异,并且分析它们在并发模型、运行环境、函数式编程和领域特性等多个方面的不同之处。

m0_56551554的博客 1173

Erlang和Golang的几点粗浅的比较

我最早使用的语言是Java和Python, 并且一直都对Python充满好感, 我喜欢这种很朴实和高效率的感觉, 但我却最后没有采用Python,原因其实也很简单, 我就是不喜欢缩进语法, 就跟很多人换工作仅仅是为了屏幕更大一点一样, 另外就是有了同样很棒的可选方案, 这就是Ruby, 所以我最终采用了Ruby作为主力编程语言, 同样也为不能使用Python而有一点小遗憾,毕竟Python的健壮性

记事本 4231

Golang和Erlang消息传递机制对比

上一篇文章介绍了 Go 和 Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制简要对比Erlang和Go虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erlang的轻量进程,Go的Goroutine), 并且都采用了消息传递的方式作为任务间交互的方式。在Erlang中,采用了一种比较纯粹的消息传递机制,进程间几乎没有任何形式的数据共享,只能通过彼此间发送消息进

Sunface撩技术 6586

Golang和Erlang的协程调度

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 coro

哦,原来你也在这里。 1938

golang PHP的区别,erlang和golang的区别

Erlang和golang的区别:第一对锁的态度不同,第二对异步IO的态度不同,第三消息机制不同。Erlang对锁非常反感,认为变量不可变可以很大程度避免锁。Golang的观点是锁确实有很大的负担,但是锁基本上是无法避免的,一旦有人共享状态并且互相抢占去改变他,这时候锁是必须存在的。 (推荐学习:go)Erlang服务器是单进程的,是逻辑上就没有并发的东西,一个Pro...

weixin_33419305的博客 198

Golang与Erlang有哪些差异

Go:引入了goroutines作为轻量级线程的概念,goroutines由Go运行时管理并在同一地址空间内运行,配合通道(channels)进行安全的数据通信,实现了简洁高效的并发编程模型。哈喽,大家好呀,淼淼又来和大家见面啦,Golang(通常简称为Go)与Erlang是两种设计目标和应用场景有所差异的编程语言,它们各自拥有独特的特性和设计理念。Go:虽然认识到锁可能带来开销,但在必要时并不回避使用锁,通过goroutine和channel的设计来简化并发编程,减少对传统锁的需求。

gulu230220的博客 554

实现Golang和Erlang的连接(Port)

在Erlang中,有很多种方式去实现与其他语言的交互,常见的几种方式有 使用TCP协议交互 使用Port 使用Erl_Interface方式去实现 CNode NIF 后面几种难度都是有的,也使用了比较复杂的C/C++,而且比较容易出现问题。TCP的方式是通过网络协议,个人也不是很喜欢,那就剩下Port方式去连接Erlang服务器。 Erlang的官方文档中对Port的介绍 在Erlang中使...

geange的博客 703

非语言之争,Go vs Erlang

因为 云巴 系统对高并发、低延迟的需求,我们对各个语言、平台做了很多的调研比较工作。这自然就包括致力于开发高并发应用的 Go 和 Erlang。

Yunba.io 的博客 956
上一篇: JVM内部原理
下一篇: 缓存入门教程
梅小西Echo
博客等级 码龄22年 94粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值