#command #server-client #input #job #distributed #parallel #slot

bin+lib mmstick/concurr

并发/并行/分布式命令行作业服务器与客户端

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年9月28日

#44 in #slot

104 星 & 12 关注者

MIT/Apache

67KB
1.5K SLoC

Concurr:Rust 中的分布式和并发命令执行

本项目采用 MIT 和 Apache 2.0 协议双授权。

该项目最初受到 GNU Parallel 项目的启发,以及我之前在 Rust 中对该项目的重新实现。Concurr 是一个用于在任意数量的系统上并行生成和执行命令的分布式和并发命令行作业服务器和客户端架构。在其核心,Concurr 使用 Tokio 来执行异步网络 I/O。客户端的工作方式类似于 GNU Parallel,但为了简化操作,有一些关键的不同之处。

客户端

客户端负责解析参数,连接到节点并获取槽位计数,向每个节点提交命令,将输入分配到每个连接节点的每个槽位,收集完成时的槽位响应,并从共享缓冲区请求新的输入。简单的事情。语法将与 GNU Parallel 非常相似,但有一些差异。

示例

concurr 'echo job {#} on slot {%}: {}' : arg1 arg2 arg3 arg4
concurr 'echo job {#} on slot {%}: {}' :: file1 file2 file3
concurr 'echo {}' < input_file
cat file | concurr 'echo {}'

客户端如何工作

服务器

服务器如何工作

该服务通过监听一系列可能的指令来工作。命令指令将告诉服务器创建一个新的命令,该命令将使用线程池监听输入,从现在起称为槽位。可以使用删除指令从服务器中删除命令,这将导致所有线程在完成任务后退出。输入指令将为命令提供输入,这些命令由整数 ID 指定,并指定作业的 ID,这对于客户端知道接收到的哪些结果可能很有用。

实际上,客户端可以向服务器发送命令,服务器将创建与系统核心数量相同的线程;在每个槽位上初始化一个 Ion shell 实例。这些槽位共享对输入缓冲区、输出缓冲区、终止开关以及相应计数器的访问,该计数器用于计算已退出的线程数量。这些都被包装在一个单元中。

当接收到客户端的输入时,该输入将与一个单元匹配,然后放置到由附加到该命令的线程共同拥有的输入缓冲区中。当某个槽获取该输入时,它将执行一个分支,捕获分支的标准输出和错误,在附加到该槽的子进程上的嵌入式Ion实例中执行命令,然后等待子进程退出,将退出状态、作业ID和包含标准输出和错误的文件描述符放置到输出缓冲区中。

提交输入的连接将等待与提交的作业ID匹配的结果,并在看到该作业后立即编码一个包含结果的响应。

示例

  1. 以下命令,分配ID为0,被发送到服务器:echo {#}: {}
  2. 服务器有四个核心,并为该命令创建四个槽。
  3. 一些输入被提交到ID为0的命令。
  • inp 0 1 one
  • inp 0 2 two
  • inp 0 3 three
  • inp 0 4 four
  1. 槽并发地从队列中获取输入,处理它们,并返回它们的输出
  • 1: one
  • 2: two
  • 3: three
  • 4: four
  1. 退出状态、作业ID、标准输出和标准错误被返回给客户端。

依赖项

~7-16MB
~181K SLoC