如何在不复制所有变量的情况下制作perl线程?

时间:2010-07-15 15:44:43

标签: multithreading perl

我有一个perl程序,使用某种形式的并行性会非常有用。

但是,我在变量中有很多数据,我在程序的那一部分根本不需要

如果我使用perl线程,它会在每次创建新线程时复制所有变量。在我的情况下,这很痛苦。

如果没有复制,我应该使用什么来制作新帖子?或者是否有一些更好的线程实现,不会复制所有内容?

3 个答案:

答案 0 :(得分:7)

就像语法一样容易线程而不是所有的胖?使用惊人的forks模块!它使用fork和IPC实现线程接口,使得在子进程之间共享数据变得容易。

答案 1 :(得分:4)

真的,你只需要避免ithreads。它们太可怕了,与地球上其他形式的线程不同,它们比普通的重量级进程更昂贵。我首选的解决方案是使用基于事件的框架,如POEAnyEvent(我使用POE),并使用POE::Wheel::Run将任何无法无阻塞的任务分解为子进程(或fork_call for AnyEvent)。以这种方式编写应用程序需要更多的前期设计工作,但如果做得对,它将为您提供一些有效的代码。我还不时编写代码,直接在其自己的事件循环中使用forkpipe(或open '-|')和IO::Select以及waitpid ,但你应该考虑我在perl之前学习C的症状,而不是推荐。 :)

明智之言:如果你在Windows上运行,那么这种方法可能几乎与直接使用ithreads一样糟糕,因为Perl使用来弥补win32缺少fork() ithreads ,因此您将在每个fork上支付相同的ithread创建成本(在CPU和内存中)。那里的不是真的很好的解决方案。

答案 2 :(得分:3)

使用fork(2) system call充分利用Copy-on-write