Nushell
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
  • 入门篇

    • 介绍
    • 安装 Nu
    • 以 Nushell 的方式思考
    • 在系统中四处移动
  • Nu 基础篇

    • 数据类型
    • 加载数据
    • 处理字符串
    • 处理列表
    • 处理表格
    • 管道
    • 命令索引
  • Nushell 编程

    • 自定义命令
    • 别名
    • 运算符
    • 变量和子表达式
    • 脚本
    • 模块
    • 覆层
  • Nu 作为 Shell 使用

    • 配置
    • 环境
    • 标准输入、输出和退出码
    • 转移到系统
    • 配置第三方提示
    • Shell 中的 Shell
    • Reedline,Nu 的行编辑器
    • 外部命令
    • 自定义补全
    • Nu 的配色和主题
    • 钩子
  • 迁移到 Nu

    • 从 Bash 到 Nu
    • 从其他 Shell 或 DSL 到 Nu
    • 从命令式语言到 Nu
    • 从函数式语言到 Nu
    • Nushell 运算符
  • 高级篇

    • DataFrames
    • 元数据
    • 创建你自己的错误
    • 并行
    • 插件

并行

Nushell 现在已经初步支持并行运行代码了,这允许你使用更多的计算机硬件资源来处理一个流的各个元素。

你会注意到这些命令包含其特有的par-命名,每一个都对应着一个非并行的版本,这允许你先轻松地以串行的风格写代码,然后再回头用几个额外的字符轻松地将串行脚本转换成并行脚本。

par-each

最常见的并行命令是par-each,它是each命令的搭档。

与each一样,par-each对管道中流入的元素进行处理,在每个元素上运行一个代码块。与each不同,par-each将并行地进行这些操作。

假设你想计算当前目录下每个子目录下的文件数量。使用each你可以这样写。

ls | where type == dir | each { |elt|
    { name: $elt.name, len: (ls $elt.name | length) }
}

我们为每个条目创建一条记录,并在其中填入目录的名称和该子目录中的文件数。

在你的机器上,时间可能有所不同。对于这台机器的当前目录来说,需要 21 毫秒的时间。

现在,由于这个操作可以并行运行,让我们把上面的操作转换为并行的,把each改为par-each:

ls | where type == dir | par-each { |row|
    { name: $row.name, len: (ls $row.name | length) }
}

在这台机器上,现在它的运行时间为 6 毫秒。这是一个相当大的差异!

顺便提一下:由于 环境变量是有作用域的,你可以使用par-each在多个目录中并行工作(注意 cd 命令):

ls | where type == dir | par-each { |row|
    { name: $row.name, len: (cd $row.name; ls | length) }
}

如果你看一下结果,你会注意到,它们每次运行返回的顺序是不同的(这取决于你系统上的硬件线程数量)。随着任务的完成,我们得到了正确的结果,如果我们希望得到结果以特定的顺序出现,我们可能需要添加额外的步骤。例如,对于上述情况,我们可能想按 "name" 字段对结果进行排序。这样,我们的脚本的each和par-each版本都能得到相同的结果。

在GitHub上编辑此页面
Contributors: Justin Ma, Hofer-Julian, Bruce Weirdan, 0x4D5352
Prev
创建你自己的错误
Next
插件