Erlang库 -- 有意思的库汇总

抄自这里

 

首先,库存在的目的大致可分为:
1、提供便利
2、尽可能解决一些痛点

首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):
1,单进程问题
Erlang虚拟机属于抢占式调度,抢占式调度有很多好处,但是同样也存在这弊端。虚拟机在默认情况下分配个每个进程的资源都是相同的,但是若一个进程(gen_server/event/fsm)要为其他许多进程提供服务,这个进程就极有可能成为整个Erlang系统的瓶颈所在。http://www.cnblogs.com/--00/p/4277640.html
2,列表解析效率
在Erlang编程语言中,list/string 是非常常见的一种数据类型,list处理的方式几乎都是遍历或者是尾递归,在list规模小的情况下,这种方式几乎不会给大家造成麻烦,但是一旦list的规模很大之后,情况就会变得非常糟糕。如list的“++”操作存在陷阱,erlang:length(List) 存在陷阱,queue:len(Queue)存在陷阱,诸如这种陷阱看起来很细碎,但是如果不好好处理,指不定就容易出现各种让我们摸不着头脑的坑。
> 前不久,我们刚刚在一个系统中,优化了一个lists:keydelete/3 的操作,大幅度提升了整个接口处理的速度。
当然,这些问题和erts的设计思路有很大的关系,如:private heap,变量不变 ... 。
3,refc binary
binary的存在在一定程度上缓解了list处理带来的“低效率”的问题,但是,refc binary(erlang:byte_size(Binary) > 64的binary)的gc又让人比较蛋疼。Erlang process structure -- refc binary
4,OOM
在一定程度上,这也是单进程问题的一个附属品。单进程获得虚拟机资源有限,处理性能不足,导致message mail box 的message不断挤压,继而引发large heap,导致整个Erlang 虚拟机crash。最最典型的就是lager了。
5,Erlang进程CPU消耗度量
一直以来,大家都在社区中试图寻找度量单个Erlang进程CPU的消耗,但是不管是Erlang现在的API函数,还是社区中的方案,都没有提供一种行之有效的方案。为什么?我简单摘抄一段Erlang_IN_Anger中的一段描述吧:
> It is generally difficult to properly analyze the CPU usage of an Erlang node to pin problems to a specific piece of code. With everything concurrent and in a virtual machine, there is no guarantee you will find out if a specific process, driver, your own Erlang code, NIFs you may have installed, or some third-party library is eating up all your processing power.



那么,究竟有哪些库,能帮我们解决(或者是缓解)这些痛点,能给我们带来便利?
1、riak_sysmon
github : basho/riak_sysmon · GitHub
对erlang:system_monitor/0,1,2 的封装,尽快的发现系统中存在的long_gc,large_heap等性能隐患。针对上述痛点中的“refc binary”和“OOM”。
2、recon
github : ferd/recon · GitHub
封装了erlang:process_info/1,2 函数,并提供了TOPN的feature,recon_alloc封装了度量虚拟机内部内存的使用量的查询。
不仅如此,recon提供了一种近似度量Erlang进程CPU消耗的方案,Erlang tool -- recon ,memory leak的检查。针对上述痛点中的“Erlang进程CPU消耗度量”、“refc binary”,并且提供了种种便利。好用到爆的感觉。
3、eper/redbug
github : massemanet/eper · GitHub
刚开始接触Erlang时,社区提供的一种代码调试方案是日志。然,这种方式太不优雅,使用起来非常麻烦。
redbug是对Erlang系统中dbg模块的封装,提供了非常安全有效的代码调试方式。“安全”对生产环境来说,确实太过重要了。
4、pooler/poolboy
github : seth/pooler · GitHub
github : devinus/poolboy · GitHub
池。Erlang单进程效率的问题,非常常见的三种方式,第一种是池,第二种是noblock call,第三种是修改某个进程的资源配置。
在社区中,常见的是第一种方案,而第二种和第三种方案常见于Erlang编程语言编源码中(rpc模块,net_kernel模块)。针对上述痛点中的“单进程问题”。
5、jiffy
github : davisp/jiffy · GitHub
json处理库,而且是nif的,能够尽可能保证效果,并且可以支持return_maps已经encode force_utf8,decode 的return_maps能直接返回map 数据类型,非常之方便。(虽然17的map效率不怎么样,但是18版本做了很大的优化)
6、entop
github : mazenharake/entop · GitHub
有没有觉得Erlang自带的etop有些难用?entop提供了非常不错的可替代方案。
7、erlang-lz4
github : szktty/erlang-lz4 · GitHub
不管是Erlang系统,还是其他系统,所倡导的都是“小消息,大计算”,加之Erlang消息传递是值传递的方式,对于大的message,稍微做一下压缩,获取能取得意想不到的效果。不放试一试,lz4 的算法,请Google 之。

8、sync
github : rustyio/sync · GitHub
on-the-fly recompiling and reloading in Erlang. 大幅度提高工作效率,避免接二连三的重新compile、generate。不过,要注意的是,最好只用在开发环境下。
> 关于热更,多叨叨两句:
> 1,在supervisor下增删 gen_server child 热更会失败,目前无解,除非修改supervisor源代码
> 2,gen_server record 增删字段,这个可用 “使用proplists字段值”或者是“map字段值”
> 3,gen_server init 函数逻辑无法热更,解决办法,重写code_change 代码
> 至于常规的逻辑代码,热更基本上没什么问题
9、erlang_term
github : okeuday/erlang_term · GitHub
存了一个Term到ETS表中,难道不应该知道这个Term到底占用了多大的内存空间吗?要send一个大的message给另一个进程,不度量一点内存占用大小就随心所欲?恐怕不太好。erlang_term可以作为贴心小工具。Erlang ets -- something about cache continue
10、folsom
github : boundary/folsom · GitHub
提供了多种Metrics 模型,根据自己的应用场景,选择不同的模型就行。内部主要使用ets:update_counter/3,4,性能效果很有保证。
11、ej
github : seth/ej · GitHub
Helper module for working with Erlang terms representing JSON
试试就知道有没有意思,好不好玩了。
12、task
github : redink-toys/task · GitHub
遇到过这样一个有意思的场景:主进程是一个普通进程,有10W量级的列表,我想将其过滤之后,将1/2或者是1/4的列表写入到ETS表中,然后进行后续的操作。如果我在主进程中做这一些列操作,这个主进程就会被挂住,因为GC(Erlang的GC不会STW,但很有可能会STP)。考虑到ETS表可以在不同的进程之间共享数据,我就可以在主进程中spawn一个进程,这个这个进程去执行过滤、写入操作,然后这个进程生命周期结束之后,GC是很简单快速的。
task就是一个spawn、receive的简单封装。
13、xref_runner
github : inaka/xref_runner · GitHub
做xref检查:善待Erlang 代码 -- Xref 实践

 

 

谢没人邀。我只是来安利一下我司和我司兄弟公司开源的一些Erlang库。现在使用Erlang的公司越来越多,但是大家都在闭门自己造轮子。我们的原则是只要有好轮子一定要好轮子,没有好轮子自己轮一个好轮子。轮子大法好。

@redink 已经安利了好多在生产环境下非常好用的一些轮子,我再补充一些我司的替代品。

1. inaka/elvis – inaka/elvis · GitHub
Erlang代码style检查,支持github webhook,支持Erlang shell内运行检查。另外inaka/erlang_guidelines提供了对初学者很友好的style guide,对一开始养成良好的代码格式用处很大。

2. inaka/xref_runner – inaka/xref_runner · GitHub
跑xref的, @redink 已经安利过了

3. inaka/apns4erl – inaka/apns4erl · GitHub
久经考验的iOS APNS推送服务

4. inaka/shotgun – inaka/shotgun · GitHub
对ninenines/gun的封装,支持SSE (Server-sent Events) handling

5. inaka/worker_pool – inaka/worker_pool · GitHub
提供比poolboy更轻量的worker pool实现,支持多种worker轮转策略

其中whisper1, tigertext, inaka是我司和友司的Github,欢迎围观,其中inaka是最有料的repo。

再安利一个Erlang Makefile - ninenines/erlang.mk · GitHub,虽然现在和一些项目不兼容而且功能还不完善,但和rebar相比,erlang.mk极大的提高了并发编译的速度。换了Erlang.mk之后感觉编译速度快了几倍。


说个坑。
benoitc/hackney · GitHub是个坑。Hackney是个坑。Hackney是个坑。虽然拼multi-part很好用,但是建议只使用hackney_lib里提供的函数封装,再使用别的http库发。Hackney pool有很多不可复现的未知问题。

最后的最后,希望越来越多公司可以开源生产级别的Erlang组件(玩具)。


P.S. 我在公司是个写PPT的。如果需要内推我司在洛杉矶(Whisper\TigerText - 人需要在美国)、深圳、以及remote(Inaka)的工作请私信我。我司和友司都是业界前列使用Erlang分布式特性的公司。(300+节点,多数据中心)

 

 

 

 

 

 

谢邀。广告时间到了。 当然是extralib了。 change-code/extralib · GitHub

extralib的本意是一些质量略低于标准库(kernel和stdlib),但是从功能上讲是目前标准库所欠缺的功能,展示Erlang的潜力。

很多无脑黑认为Erlang缺乏metaprogramming能力,实际上Erlang是目前metaprogramming能力最强的语言。Erlang提供了parse_transform,还有隐藏的更深的core_transform。

更棒的是,现在在extralib里,我们引入了ext_syntax_trans,你可以使用任意语法写Erlang程序了,同时,还复制粘贴了一遍Erlang的parser,这样,就可以有scan_transform了。

现在就是来看看这个scan_transform有多大的威力了。在你的Erlang代码里加入这么两行,在Erlang里你就可以有和Python一样的Raw String了。 @牛耿

-compile({parse_transform, ext_syntax_trans}).
-compile({parser, {ext_epp, parse_file, [{passes, [ext_tokenline_pp, ext_rawstring_pp]}, {scan_options, [text]}]}}).


在有这个之前你是这么写正则表达式的

"\\r\\n\""


现在你可以这么写了

r"\r\n\""


还不快来用Erlang

转载于:https://www.cnblogs.com/ziyouchutuwenwu/p/4865238.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)

#include "tchar.h"#include int main(){/*****************************打开串口*************************************/HANDLE hCom;//全局变量,串口句柄hCom CreateFile(_T("COM3"),//COM3口GENERIC_READ | GENERIC_WRITE,//允许读和写0,/…

scikit-learn决策树算法类库使用小结

之前对决策树的算法原理做了总结,包括决策树算法原理(上)和决策树算法原理(下)。今天就从实践的角度来介绍决策树算法,主要是讲解使用scikit-learn来跑决策树算法,结果的可视化以及一些参数调参的关键点。 1. scikit-learn决策树算法类库介绍…

3.js模式-策略模式

1. 策略模式 策略模式定义一系列的算法&#xff0c;把它们封装起来&#xff0c;并且可以互相替换。 var strategies { isNonEmpty: function(value,errMsg){ if(value ){ return errMsg; } }, minLength:function(value,length,errMsg){ if(value.length < length){ retur…

c语言编写程序求8,使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+……+28*29*30的值...

使用c语言编写程式&#xff0c;实现计算1*2*34*5*67*8*9……28*29*30的值以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;使用c语言编写程式&#xff0c;实现计算1*2*34*5*67*8*9……28*29*3…

PHP 正则表达式分割 preg_split 与 split 函数

为什么80%的码农都做不了架构师&#xff1f;>>> preg_split() preg_ split() 函数用于正则表达式分割字符串。 语法&#xff1a; array preg_split( string pattern, string subject [, int limit [, int flags]] ) 返回一个数组&#xff0c;包含 subject 中沿着与…

简单学C——第五天

结构体 首先明确&#xff0c;结构体是一种构造的数据类型&#xff0c;是一种由多个数据类型如 int&#xff0c;char&#xff0c;double&#xff0c;数组或者结构体......组成的类型,现在告诉大家如何定义一个结构体。在定义int整型变量时&#xff0c;大家肯定都知道 int a; 即…

C语言二叉树实验报告流程图,二叉树的建立与遍历实验报告(c语言编写,附源代码).doc...

二叉树的建立与遍历实验报告(c语言编写,附源代码).doc第 1 页&#xff0c;共 9 页二叉树的建立与遍历实验报告级 班 年 月 日 姓名 学号_ 1实验题目建立一棵二叉树&#xff0c;并对其进行遍历(先序、中序、后序)&#xff0c;打印输出遍历结果。2需求分析本程序用 VC 编写&#…

三角函数泰勒展开C语言,第六章-函数作业 ---三角函数泰勒级数展开式计算正弦函数值...

E201_06_02_正弦函数题目要求&#xff1a;按照三角函数泰勒级数展开式计算正弦函数值&#xff1a;,直到最后一项的绝对值小于106解题思路&#xff1a;1. 输入弧度2. 确定初始化值3. 求阶梯函数代码&#xff1a;public class E201_06_02_正弦函数 {public static void main(Stri…

Codeforces Round #325 (Div. 2) B. Laurenty and Shop 前缀和

B. Laurenty and Shop Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/586/problem/BDescription A little boy Laurenty has been playing his favourite game Nota for quite a while and is now very hungry. The boy wants to make sau…

python学习感悟第3节

在继列表的学习之后&#xff0c;进行了元组的学习。元组和列表功能相似&#xff0c;只是元组不能进行修改&#xff0c;所以元组又叫只读列表。 下面列举的是一系列的字符串操作&#xff1a; name.capitalize() #首字母大写 name.count("a") #数列表中有几个a name…

MyBatis_ibatis和mybatis的区别【转】

1. ibatis3.*版本以后正式改名为mybaits&#xff0c;它也从apache转到了google code下&#xff1b;也就是说ibatis2.*&#xff0c;mybatis3.*。2. 映射文件的不同ibatis的配置文件如下<?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE sqlMapCo…

android gallery自动播放,可循环显示图像的Android Gallery组件

类型&#xff1a;源码相关大小&#xff1a;23.6M语言&#xff1a;中文 评分&#xff1a;9.1标签&#xff1a;立即下载第 4 页 实现循环显示图像的Gallery组件实现循环显示图像的Gallery组件在本节将组出与循环显示图像相关的ImageAdapter类的完整代码。读者可以从中看到上一节介…

docker内程序如何读取dockerfile和compose.yml中设置的环境变量

docker内程序如何读取dockerfile和compose.yml中设置的环境变量 背景 compose文件中配置了服务A和服务B&#xff0c;其中B服务调用了A服务的接口&#xff0c;那么B的实现代码中该如何调用A的服务呢&#xff1f; 解决 compose文件中&#xff0c;服务B的配置加入A的接口&#xff…

2015年10月13日

关于挣钱&#xff0c;我觉得&#xff0c;只要兴趣所在&#xff0c;能把事做好&#xff0c;钱自己就会来。收入上不去&#xff0c;往往是做的事情就不在高收入的那个区间&#xff0c;写程序很难出富翁。说实话&#xff0c;外围一天的消费可能就是你工资的好几倍&#xff0c;不用…

Spring Boot Servlet

上一篇我们对如何创建Controller 来响应JSON 以及如何显示数据到页面中&#xff0c;已经有了初步的了解。 Web开发使用 Controller 基本上可以完成大部分需求&#xff0c;但是我们还可能会用到 Servlet、Filter、Listener、Interceptor 等等。 当使用spring-Boot时&#xff0c;…

基于相关性分析系统性能瓶颈

测试的过程中&#xff0c;难免需要会遇到一些性能瓶颈&#xff0c;那么就要求我们能够分析出性能瓶颈&#xff0c;并给出解决方案。性能瓶颈很抽象&#xff0c;我们可以通过数据使其具象。以我工作内容为例&#xff0c;服务器处理数据的能力是有限的&#xff0c;那么其处理的边…

curl网站开发指南

curl网站开发指南 作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月 4日 我一向以为&#xff0c;curl只是一个编程用的函数库。 最近才发现&#xff0c;这个命令本身&#xff0c;就是一个无比有用的网站开发工具&#xff0c;请看我整理的它的用法。 curl网站开发指南 阮一…

android格式化时间中文版,Android 仿微信聊天时间格式化显示功能

本文给大家分享android仿微信聊天时间格式化显示功能。在同一年的显示规则&#xff1a;如果是当天显示格式为 HH:mm 例&#xff1a;14:45如果是昨天,显示格式为 昨天 HH:mm 例&#xff1a;昨天 13:12如果是在同一周 显示格式为 周一 HH:mm 例&#xff1a;周一14:05如果不是同一…

java分享第十七天-01(封装操作xml类)

做自动化测试的人&#xff0c;都应该对XPATH很熟悉了&#xff0c;但是在用JAVA解析XML时&#xff0c;我们通常是一层层的遍历进去&#xff0c;这样的代码的局限性很大&#xff0c;也不方便&#xff0c;于是我们结合一下XPATH&#xff0c;来解决这个问题。所需要的JAR包&#xf…

Ubuntu12.04 内核树建立

先查看自己使用的内核版本 linlin-virtual-machine:~$ uname -r 3.2.0-23-generic 如果安装系统时&#xff0c;自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。 linlin-virtual-machine:~$ cd /usr/src linlin-virtual-machine:/usr/src$ ls linux-headers-3.2.0…