更新了 Logger.metadata1 的文档 #5158

lexmeg :第一段要很简洁,因为它要起到概括作用啊。我们这样写好不好:"Alters the current process metadata according the given keyword list."?大家觉得咋样?

jeregrine :嗯?好像不是很规范啊。。。我觉得多分几段更好。

lexmag :我们可以在第二段解释它的工作原理:

Alters the current process metadata according the given keyword list.<describes what happens in case of `nil` value under a key>

whatyouhide :我看行:)

最终结果:

  @doc """Adds the given keyword list to the current process metadata. This also allows you to remove a key from the metadata by setting a key to nil. """def metadata(keywords) do{enabled?, metadata} = __metadata__()metadata =Enum.reduce(keywords, metadata, fn{key, nil}, acc -> Keyword.delete(acc, key){key, val}, acc -> Keyword.put(acc, key, val)end)Process.put(@metadata, {enabled?, metadata}):okend

File.writeFile.write! 利用 writev #5154

nathanl :为了优化性能,通常我们都会在:raw模式下使用:file.write/3,而不是:file.write_file/3。这样子BEAM就会使用系统调用writev而不是write。
好处就是,写iolist的时候,BEAM就不需要把元素连接起来,并生成一个用来写入的binary了。操作系统会从内存中单独地读取每个元素;最后的输出只会产生在目标文件里。跳过连接成binary的步骤,减少了工作量,节约了时间,还减少了垃圾的产生。
注意:给定了一种字符编码,:raw模式就不能用了哦。在:raw模式下,BEAM不会再创建一个单独的进程来处理文件,我觉得它用的进程就是用来执行字符编码的那个。所以啊,如果给定了编码,比如UTF-8,那我们就不用:raw模式了,也就是说不使用writev。

fishcakez :我不是很懂啊,:raw模式下使用:file.write/3有什么不同?
注意在:file中有一处注释说:file.write_file/3应该被移动到文件服务器中以提高效率。正如:file.write_file/2使用raw模式,相当于在文件服务器中运行。

nathanl :好问题。我也觉着不应该有不同,但就是有嘛。当我在iex中这样:

:file.write_file("/tmp/tmp.txt", ["foo", "bar"], [:raw])

然后用Evan Miller的 dtrace 脚本来查看它,我发现用的是write。但是如果:

{:ok, file}  = :file.open("/tmp/tmp.txt", [:write, :raw])
:file.write(file, ["foo", "bar"])

,,,这里用的就是writev了,说实话我也不造为啥。

josevalim :write_file 会先把所有东西都转换成binary。也就是说,如果给定了编码,我们就要把所有东西转换成binary了。(我们没用:raw模式)。

fishcakez :哥们儿这是个 :file 里的 bug 啊,如果是raw文件就不该调用 make_binary/1。

josevalim :差不多就是这个原因。我们要不要去Erlang/OTP里修复这个bug?

nathanl :因为Erlang的UTF-8编码靠不住么?我添加了一个对charlists转换的测试,发现如果给定一个很大的代码点,例如9731 (☃),Erlang就会发出抱怨。

fishcakez :我说,无论咱在这里做什么,都应该去把Erlang/OTP给修复了。

josevalim :好的,那样我们这里的问题也会被修复。

fishcakez :听起来不错哦。

nathanl :那太好了。如果我们准备好合并这个,我会保证是一次提交,这样当Erlang那边修复好了,我们可以很容易地移除。

josevalim :write_file期望的是IO数据。所以不会进行Unicode转换。我觉得任何>255的列表都会失败。我们之所以要转换成binary,是因为不使用raw模式的时候,会生成一个新的进程,用binary在进程间传输效率更高。调用IO.iodata_to_binary可以完成这个转换。

nathanl :基于fishcakez的反馈,不再自动设置为:raw模式。所以现在仅当用户使用File.write("/tmp/tmp.txt", [foo, bar, foo], [:raw])的时候,能够得到writev的好处。

nathanl :所有问题都解决好之后,我会精简代码,然后提交。就像之前说的那样。

josevalimnathanl,鉴于我们已经基本实现了file:write_file,我确信我们应该直接把修复发给Erlang/OTP。我之前之所以同意你的补丁,是因为我们默认是raw模式,但是fishcakez证明了这是个坏主意。
也就是说,我不认为我们应该合并这个修改,抱歉哥们儿。往好的地方想,如果没有你的补丁和工作,我们又怎么能得出这个结论呢,所以这些工作绝对没有白费。如果在为Erlang/OTP提交补丁的时候你需要帮助,或者你希望我来做这个,尽管说。
多谢了!

nathanl :没事儿!我想我会试试看的,但我会回来求助,毕竟哥从来没写过Erlang。
你看下我的理解正确不:它们在这一行里将输入转换成binary,应当把它改成仅在模式列表中没有raw时执行。

josevalim :是滴!
随时联系我。这个Pull request就先关了哈。

Elixir日常观察 VOL.1相关推荐

  1. 交换机日常使用保养与故障排除

    企业交换机,通常承载着企业内部所有计算机的信息流通,因此企业网络管理员除了作好网络计算机的单机维护外,对于网络连接设备的维护与保养也是十分重要的.从实际使用情况来看,虽然企业交换机属于不易出现故障的设 ...

  2. 公司网络推广为你解答蜘蛛为什么有抓取网页却没收录?

    可能优化人员们在公司网络推广日常观察网站数据的时候会发现一类这样的问题,那就是蜘蛛虽然爬取过我们的网站,但是页面仍然没有收录,也仅仅是路过?那么为什么会出现这样的情况呢?下面公司网络推广就带大家一起来 ...

  3. 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记一

    bit这个词原来是从binary digit的缩写得到的.在计算机时代,比特被看做是组成信息块的基本单位. 某一位或一连串比特位所表示的意义通常是和上下文有关. 比特通常无法从日常观察中找到,它深藏于 ...

  4. 那些曾经拥有的最大快乐,都是好奇心的结果

    ▲   点击查看 对于孩子们来说,强烈的好奇心和求知欲,是一种本能.在他们懵懵懂懂长大的过程中,总是对周围的世界充满着各种各样的疑问: "叶子为什么是绿色的?" "为什么 ...

  5. 程序员为什么要学习软件工程

    按照惯例,先回顾一下这周完成的工作: (1)练习英语听力240分钟 (2)完成了三个Test Case的自动化测试实现 (3)修复5个bug (4)发布小版本,做回归测试 (5)读完<构建之法& ...

  6. 走进少儿编程教育的基础性原理

    少儿编程的基础,既有数学,也有逻辑.逻辑思维能力,是青少年发展的一个基本能力,在文理各个方向都是十分重要的基础.青少年编程,可能是第一次对儿童正式的.系统的进行逻辑方面的锻炼.格物斯坦认为:少儿编程用 ...

  7. 幼儿园介绍信(15篇)

    摘要: 介绍信格式范文大全,适用幼儿园介绍信,共计15篇. 幼儿园介绍信1 尊敬的老师: 您好! 我们是豆豆的家长,久仰贵校的教育质量和办学成果,现在孩子马上就要小学毕业,故特向贵校提出申请,希望进入 ...

  8. 阿里设计师带你探讨UxD设计是什么?

    最近针对UxD的讨论逐步增多,在微信/知乎等各个专栏都时不时会见到围绕UxD发展和价值相关的讨论.从评论中可以看出,有人焦虑,有人不理解,有人不屑.见到不少把UxD理解成啥都做的全栈设计师,认为UxD ...

  9. 可解释的机器学习,用于科学的见解和发现(Explainable Machine Learning for Scientific Insights and Discoveries)

    可解释的机器学习,用于科学的见解和发现(Explainable Machine Learning for Scientific Insights and Discoveries) 原文作者:Ribana ...

最新文章

  1. MATLAB从入门到精通-缺失值和异常值的处理应用案例
  2. Multi-Range Read (MRR)原理
  3. @webservice报错org.apache.cxf.common.i18n.UncheckedException: No operation was found with
  4. 没有一款趁手的数据监控软件?试一下NetData不,用了你就绝对离不开他!
  5. Openfire服务端安装和配置
  6. EMNLP2021 论文预讲会,邀你一起共赏自然语言处理学术盛宴(日程全公开)
  7. Ubuntu常用终端命令
  8. 《斯坦福算法博弈论二十讲》学习笔记(持续更新)
  9. Repast Statecharts
  10. 【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码
  11. mysql触发器报错_mysql触发器实例:莫名其妙的错误?
  12. matlab仿真AMI码变换,matlab编程
  13. 金博宝芝灵K6医药管理软件吉度盘点机PDA盘点
  14. 关于VO、RVO、ORCA的个人理解
  15. 游戏策划学习(二)---游戏策划与开发方法---常见的游戏类型
  16. Quartz定时任务-@DisallowConcurrentExecution注解
  17. slice、splic、splite相互间的区别
  18. app间共享(交互)方法
  19. 计算机二级word邀请函制作步骤,利用邮件合并制作邀请函(2)
  20. 上海电气“星云智汇”工业互联网平台

热门文章

  1. Cisco交换机密码配置整理
  2. 阿里开源组装式 Flutter 应用框架 Fish Redux
  3. tomcat war包自动化部署脚本
  4. 容器数据卷网络基本配置
  5. 剑指offer二之替换空格
  6. iOS: 零误差或极小误差的定时执行或延迟执行?
  7. iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置
  8. android aidl接口初步了解
  9. 使用外部表关联MySQL数据到Oracle
  10. 《WinForm开发系列之控件篇》Item18 FileSystemWatcher(暂无)