gpt4 book ai didi

multithreading - 线程 : worth it for this situation?

转载 作者:行者123 更新时间:2023-12-03 15:59:50 26 4
gpt4 key购买 nike

之前没用过线程,但想我可能遇到了一个机会:

我编写了一个脚本,它可以读取大约 500 个 Excel 文件的数组,并使用 Parse::Excel 从工作簿中的特定工作表中提取值(平均每个工作簿有两张工作表;每张工作表提取一个单元格。)

现在运行它,我只是一个一个地浏览文件数组并从文件中提取相关信息,大约需要 45 分钟才能完成。

我的问题是:这是一个使用线程的机会,并且一次有多个文件被命中*,还是我应该接受 45 分钟的运行时间?

(* - 如果这是对我可以用线程做什么的严重误解,请说出来!)

预先感谢您提供的任何指导!

编辑 - 添加示例代码。下面的代码是在 foreach 循环中为存储在数组中的每个文件位置调用的子:

# Init the parser
my $parser = Spreadsheet::ParseExcel->new;
my $workbook = $parser->parse($inputFile) or die("Unable to load $inputFile: $!");

# Get a list of any sheets that have 'QA' in the sheet name
foreach my $sheet ($workbook->worksheets) {
if ($sheet->get_name =~ m/QA/) {
push @sheetsToScan, $sheet->get_name;
}
}
shift @sheetsToScan;

# Extract the value from the appropriate cell
foreach (@sheetsToScan) {
my $worksheet = $workbook->worksheet($_);
if ($_ =~ m/Production/ or $_ =~ m/Prod/) {
$cell = $worksheet->get_cell(1, 1);
$value = $cell ? $cell->value: undef;
if (not defined $value) {
$value = "Not found.";
}
} else {
$cell = $worksheet->get_cell(6,1);
$value = $cell ? $cell->value: undef;
if (not defined $value) {
$value = "Not found.";
}
}

push(@outputBuffer, $line);

最佳答案

线程(或使用 fork 使用多个进程)允许您的脚本一次使用多个 CPU。对于很多任务来说,这可以节省大量的“用户时间”,但不会节省“系统时间”(甚至可能会增加系统时间来处理启动和管理线程和进程的开销)。以下是线程/多处理将 的情况不是 乐于助人:

  • 你的脚本任务不适合并行化——当你的算法的每一步都依赖于前面的步骤时
  • 与创建和管理新线程或新进程的开销相比,您的脚本执行的任务既快速又轻量
  • 您的系统只有一个 CPU 或者您的脚本只能使用一个 CPU
  • 您的任务受限于与 CPU 不同的资源,例如磁盘访问、网络带宽或内存——如果您的任务涉及处理通过慢速网络连接下载的大文件,那么您的网络就是瓶颈,并且正在处理文件在多个 CPU 上将无济于事。同样,如果您的任务消耗了系统内存的 70%,那么使用第二个和第三个线程将需要分页到您的交换空间并且不会节省任何时间。如果您的线程竞争某些同步资源(文件锁、数据库访问等),并行化的效率也会降低。
  • 你需要考虑系统上的其他用户——如果你在一台机器上使用所有内核,那么其他用户的体验会很差
  • [添加,仅限线程]您的代码使用任何非线程安全的包。大多数纯 Perl 代码都是线程安全的,但使用 XS 的包可能不是
  • [已添加] 当您仍在积极开发核心任务时。并行代码中的调试要困难得多

  • 即使这些都不适用,有时也很难判断任务将从并行化中受益多少,唯一可以确定的方法是实际实现并行任务并对其进行基准测试。但是您描述的任务看起来可能是并行化的一个很好的候选者。

    关于multithreading - 线程 : worth it for this situation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085042/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com