【发布时间】:2015-01-15 19:56:10
【问题描述】:
我有一个运行时间超过 13 小时的 perl 程序。我认为它可以从引入多线程中受益,但我以前从未这样做过,我不知道如何开始。
这是我的情况: 我有一个包含数百个文本文件的目录。我使用基本的 for 循环遍历目录中的每个文件并进行一些处理(对文件本身进行文本处理,在文件上调用外部程序并对其进行压缩)。完成后,我转到下一个文件。我继续以这种方式以串行方式一个接一个地处理每个文件。这些文件彼此完全独立,并且进程不返回任何值(除了成功/失败代码),因此这似乎是多线程的一个很好的候选者。
我的问题:
- 如何重写我的基本循环以利用线程?那里似乎有几种线程模式。
- 如何控制当前运行的线程数?如果我有 N 个可用内核,如何将线程数限制为 N 或 N - n?
- 我需要手动管理线程数还是 Perl 会为我做这件事?
任何建议将不胜感激。
【问题讨论】:
-
获取文件列表,然后使用 Parallel::ForkManager 循环,其中使用
exec启动处理器。 -
如果你的程序是 IO 绑定的(听起来可能是这样),那么多线程不会加速你的程序。它实际上可能会减慢速度!
-
@AKHolland,文件压缩通常受 CPU 限制
-
@ikegami 这取决于,并且在潜入重写他的程序之前肯定值得做一些分析。
-
@AKHolland,Profilling?你的意思是基准测试。由于缓存,很难准确地做,但下面会给出一个想法:
time bash -c 'extprog file1; extprog file2'vstime bash -c 'extprog file1 & extprog file2'
标签: multithreading perl