线程与分叉(解释我想做什么)

时间:2013-04-28 00:08:06

标签: perl

所以,我在发布之前已经审阅了大量文章和论坛,但我一直在阅读相互矛盾的答案。首先,操作系统不是问题,我可以使用Windows或Unix,无论哪种方式最适合我的问题。我有大量的数据需要用于只读目的(不知道为什么这很重要,但是,如果确实如此,我将要经历的数据结构是一个数组哈希数组的数组,其值也是数组)。我本质上是在比较一个"查询"大量不同的句子"并计算它们的相对相似性。从这些数量(几百万),我想采取顶部x%,并与他们做一些事情。我需要并行化这个过程。对我来说,缩小空间并不是一个好方法 - 我需要比较一切以获得好的结果,并且只需要花费很长时间来进行某种线程/分叉。我再次看到了许多相互矛盾的答案,并且不知道该做什么。

任何帮助将不胜感激。提前谢谢。

编辑:我不认为内存使用量会有问题,但我不知道(8 GB RAM)

2 个答案:

答案 0 :(得分:17)

如果没有更详细的问题,可以给出的帮助不大。您想要并行化流程。 Perl中的线程和分支有优点和缺点。

使Perl线程与其他线程不同的一个关键因素是数据默认不共享。这使得线程更容易和更安全,您不必担心库或大多数代码的线程安全性,只需要担心线程位。然而,它可能是性能拖累和内存饥饿,因为Perl必须将解释器的副本和所有加载的模块放入每个线程。

说到分叉,我只会谈论Unix。 Perl使用线程在Windows上模拟fork,它可以工作,但它可能很慢而且有错误。

分叉优势

  • 创建分叉非常快
  • 非常健壮

分叉缺点

  • 流程之间的沟通可能很慢而且很尴尬

线程优势

  • 线程协调和数据交换相当容易
  • 线程相当容易使用

线程缺点

如果文档是最新的,那最后一个有点麻烦。如果你要做很多SQL,不要使用线程。

通常,为了从Perl线程中获得良好的性能,最好启动一个线程池并重用它们。叉子可以更容易地创建,使用和丢弃。

归结为什么适合您的思维方式和您的特定问题。

对于这两种情况,您可能都想要管理您的工作人员。对于分叉,您将要使用Parallel::ForkManagerChild。孩子特别好,因为它建立了进程间通信。

对于线程,您要使用threads::sharedThread::Queue并阅读perlthrtut

在阅读有关Perl线程的文章时,请记住,当它们在2002年引入5.8.0时它们有点废话,并且只能通过5.10.1进行维护。在那之后他们已经相当坚定了。有关其效率和稳健性的信息和意见往往会过时。

答案 1 :(得分:0)

线程可能更难以正确,但不会使用尽可能多的内存。

分叉可以更简单地实现,但使用大量内存。

如果你没有任何经验,我会先实施一个分叉版本&从那里开始。