Perl脚本,使用fork或线程?

时间:2010-11-17 11:53:36

标签: perl

我正在编写一些脚本来收集来自多个服务器的数据,这个数字会增长,并且我会尝试将来证明我的脚本,但是我有点卡住了。

所以首先我有一个脚本在mysql数据库中查找IP,然后连接到每个服务器获取一些信息,然后再将它放入数据库。

我一直认为这是有限的时间来做这个,如果我有100台服务器,需要一点时间去每个服务器获取信息,然后将其推送到数据库。所以我想过在perl中使用fork或thread吗?

在我的情况下哪个会是首选?有没有人有任何例子?

谢谢!

编辑:好的,所以需要更多的信息:我在Linux上运行,我认为我可以获得主脚本来收集数据库信息,然后发送每个子进程/任务来连接和收集信息然后推送信息回到数据库。

2 个答案:

答案 0 :(得分:4)

哪个最好取决于你的需求;但是我的经验是值得的:

上次我使用perl的帖子时,我发现它实际上比分叉更慢,更有问题,因为:

  • 线程无论如何都会复制所有数据,就像一个线程一样,但是一切都在前面
  • 线程并不总是在退出时清理复杂的资源;引起缓慢的内存泄漏,这在服务器中是不可接受的
  • 几个模块没有干净地处理线程,包括我使用的数据库模块,这些模块很严重。

要注意的一个陷阱是“forks”库,它模拟“线程”但使用真正的分叉。我在这里遇到的问题是它模仿的许多行为正是我试图摆脱的。我最终使用了经典的老式“fork”并使用套接字在需要的地方进行通信。

forks(库,而不是fork命令)的问题:

  • 仍然困惑数据库系统
  • 共享变量仍然非常有限
  • 覆盖'fork'命令,导致软件中其他地方出现意外行为

答案 1 :(得分:3)

分叉比线程更“资源安全”(想想数据库模块等),所以你可能想要走这条路。

另一方面,根据您选择的平台,您可能希望避免使用Perl中的fork()。引自perlfork(1):

  

Perl提供了一个fork()关键字   对应于Unix系统调用   同名。在大多数类Unix上   fork()系统调用的平台   可用,Perl的fork()简单   叫它。

     

在某些平台上,例如Windows   fork()系统调用不在哪里   可用,Perl可以构建   在解释器上模拟fork()   水平。虽然模拟是   旨在兼容   可能与真正的fork()在   Perl程序的级别,有   某些重要的差异   源于所有伪的事实   以这种方式创造的子“过程”   生活在同样真实的过程中   就操作系统而言。