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

Perl 线程与分叉(解释我想做什么),perl,Perl,所以,在发布这篇文章之前,我已经阅读了大量的文章和论坛,但我一直在阅读相互矛盾的答案。首先,操作系统不是一个问题,我可以使用Windows或Unix,无论什么都可以解决我的问题。我有大量的数据需要用于只读目的(不确定这有什么关系,但如果有关系,我将要经历的数据结构是一个哈希数组数组,其值也是数组)。我本质上是将一个“查询”与大量不同的“句子”进行比较,并计算它们的相对相似性。从这些数量(几百万)中,我想取最大的x%,并用它们做些事情。我需要并行化这个过程。对于我来说,没有什么好方法可以减少空间—

所以,在发布这篇文章之前,我已经阅读了大量的文章和论坛,但我一直在阅读相互矛盾的答案。首先,操作系统不是一个问题,我可以使用Windows或Unix,无论什么都可以解决我的问题。我有大量的数据需要用于只读目的(不确定这有什么关系,但如果有关系,我将要经历的数据结构是一个哈希数组数组,其值也是数组)。我本质上是将一个“查询”与大量不同的“句子”进行比较,并计算它们的相对相似性。从这些数量(几百万)中,我想取最大的x%,并用它们做些事情。我需要并行化这个过程。对于我来说,没有什么好方法可以减少空间——我需要对所有内容进行比较以获得好的结果,而使用某种线程/分叉会花费太长的时间。再一次,我看到了许多相互矛盾的答案,不知道该怎么办

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


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

线程可能更难正确执行,但不会占用那么多内存

分叉可能更容易实现,但会占用大量内存


如果您对这两个方面都没有经验,我将从实现一个分叉版本开始&从那里开始。

如果没有关于您的问题的更多详细信息,就没有多少帮助了。您希望并行化进程。Perl中的线程和分支各有优缺点

使Perl线程不同于其他线程的一个关键因素是默认情况下不共享数据。这使线程更容易和更安全地使用,您不必担心库或大部分代码的线程安全,只需担心线程部分。然而,这可能是一个性能拖累和内存消耗问题,因为Perl必须将解释器和所有加载模块的副本放入每个线程中

说到分叉,我将只讨论Unix。Perl使用线程在Windows上模拟fork,虽然它可以工作,但速度很慢,而且有缺陷

分叉优势

  • 创建叉的速度非常快
  • 非常健壮
分叉缺点

  • 进程之间的通信可能缓慢而笨拙
线程优势

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

  • 每个线程占用大量内存
  • 线程启动可能很慢
  • 线程可能有缺陷(perl越新越好)
如果文档是最新的,那么最后一个有点糟糕。如果要执行大量SQL,请不要使用线程

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

真正的原因是什么符合你的思维方式和你的特殊问题

无论哪种情况,你都可能需要一些东西来管理你的员工队伍。对于分叉,您将要使用或。Child特别好,因为它内置了进程间通信

对于要使用的线程,请阅读


在阅读有关Perl线程的文章时,请记住它们在2002年5.8.0中引入时有点垃圾,只有在5.10.1中才可用。在那之后,他们已经相当坚定了。有关其效率和健壮性的信息和观点往往会迅速过时。

Perl消耗的内存比您预期的要多。在开始之前,请尝试加载数据结构,看看需要花费多少时间,结果可能会让您感到惊讶。我没有看到任何问题。问题是我应该使用什么:线程还是分叉?在Perl中,这完全是另一种方式。那么,您建议使用线程?由于线程在输出结果之前是完全独立工作的,所以我甚至需要使用类似于
join()
?您可以将
perlthrut
作为电子书获得。周日轻松阅读:-)是的,终于找到了正确的答案。我没有注意到每个线程都需要为每个单独的线程加载模块这一事实,这使得脚本出现错误,但显然在perl中分叉似乎很方便