我遇到过一些类似的情况,我可以将单核绑定任务分解为多个部分,并将每个部分作为单独的作业在 bash 中运行以将其并行化,但我很难将返回的数据整理回单个数据溪流。到目前为止,我的天真的方法必须创建一个临时文件夹,跟踪 PID,让每个线程使用其 pid 写入文件,然后在所有作业完成后读取所有 pid 并将它们按 PID 生成的顺序合并到一个文件中。有没有更好的方法来使用 bash/shell 工具来处理这种多入一出的情况?
我遇到过一些类似的情况,我可以将单核绑定任务分解为多个部分,并将每个部分作为单独的作业在 bash 中运行以将其并行化,但我很难将返回的数据整理回单个数据溪流。到目前为止,我的天真的方法必须创建一个临时文件夹,跟踪 PID,让每个线程使用其 pid 写入文件,然后在所有作业完成后读取所有 pid 并将它们按 PID 生成的顺序合并到一个文件中。有没有更好的方法来使用 bash/shell 工具来处理这种多入一出的情况?
这几乎正是 GNU Parallel 所做的。
还有一些额外的好处:
--keep-order
.--line-buffer
.GNU Parallel 有很多功能可以将任务拆分为更小的作业。也许您甚至可以使用其中之一来产生较小的工作?
您提出的建议似乎很明智,因为它避免了在数据完成之前考虑如何合并数据。所以,老实说,这不是一个坏方法!
另一个常见的解决方案是有一个中央程序来收集数据,理解数据“片段”语义/边界并在你进行时合并事物。
如何实现这在很大程度上取决于您生成的数据类型!这可以像一个真正最小的程序一样简单,只是读取消息,例如从 UNIX 或 UDP 或 TCP 套接字中读取消息(但您可能需要考虑使用序列化格式,以便可以知道某个数据点在哪一点完成),每个工人一个插座。或者只是运行一个小型关系数据库服务器(PostgreSQL?)。或者您使用例如 ZeroMQ 套接字来拥有多个发布者和中央合并作为订阅者,另外还有一个好处是这也可以立即在网络上运行。或者您将数据库用于时间序列数据。或者您的数据看起来更像是日志消息,因此您实现了通过 syslog 或 记录结果的工作人员
sd_journal_print
,并使用 journald 的日志命名空间将所有这些日志消息放入一个文件中。最后,您的选择确实是:
你如何实际做到这一点 100% 取决于你的数据结构、数量和你想要合并的方式。