使用 xargs 进行并行处理
随着图书馆的持续扩建,我们希望加快文件处理速度。对于彼此独立的任务,并行运行它们可以显著减少总执行时间。xargs 的 -P 选项允许我们同时运行目标命令的多个实例,这可以显著提高 I/O 密集型操作或涉及等待的任务的性能。这是 xargs 相对于使用 for 循环进行简单顺序处理的一个关键优势。
首先,让我们创建一个脚本,通过在内容中添加时间戳并引入延迟来模拟处理书籍。这个延迟将帮助我们可视化并行执行的过程。
cat ~/project/process_book.sh
你应该会看到:
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## Simulate some processing time
该脚本执行以下操作:
- 它接受一个书名作为参数(
$1)。
- 它创建一个新文件,在书名前加上「processed_」前缀。
- 它向该文件写入一条消息,包括当前的日期和时间。
- 它等待 2 秒以模拟处理时间,使并行执行更加明显。
现在,让我们使用带有 -P 选项的 xargs 来并行处理书籍。我们还将再次使用 -I 选项将每个书名作为参数传递给我们的脚本。
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
让我们分解这个命令:
cat ~/project/more_books.txt:读取我们的书籍列表。
|:管道符号将输出发送到 xargs。
xargs -P 3:告诉 xargs 最多并行运行 3 个进程。xargs 将同时启动目标命令的最多 3 个实例,每个实例处理一个或多个输入项。
-I {}:将 {} 定义为每个输入项的占位符,它将作为参数传递给我们的脚本。
~/project/process_book.sh {}:为每本书运行的命令,其中 {} 被替换为书名。
此命令将开始同时处理最多 3 本书。运行命令后,你可以检查处理后的文件内容:
cat ~/project/processed_*
你应该会看到输出显示书籍是在略有不同的时间处理的,这表明了并行执行。确切的时间会有所不同,但你可能会看到类似以下内容:
Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024
请注意前三本书是如何同时开始处理的,而最后两本书在大约 2 秒后开始(由于我们脚本中的 sleep 2)。这展示了并行处理的实际效果,这是使用 xargs 加速独立任务的一个显著优势。