Perl脚本,使用fork还是线程?

Perl脚本,使用fork还是线程?,perl,Perl,我正在编写一些fo脚本,这些脚本可以从多个服务器收集数据,数量会增加,并且我会尝试用它来验证我的脚本,但是我有点卡住了 首先,我有一个脚本,它在mysql数据库中查找IP,然后连接到每个服务器,获取一些信息,然后再次将其放入数据库 我一直在想的是,这样做的时间有限,如果我有100台服务器,那么每个服务器都需要一点时间来获取信息,然后将其推送到数据库。所以我考虑过在perl中使用fork还是线程 在我的情况下,哪一个是首选的选择?有人举过例子吗 谢谢 编辑:好的,所以需要更多的信息:我在Linux

我正在编写一些fo脚本,这些脚本可以从多个服务器收集数据,数量会增加,并且我会尝试用它来验证我的脚本,但是我有点卡住了

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

我一直在想的是,这样做的时间有限,如果我有100台服务器,那么每个服务器都需要一点时间来获取信息,然后将其推送到数据库。所以我考虑过在perl中使用fork还是线程

在我的情况下,哪一个是首选的选择?有人举过例子吗

谢谢


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

分叉更“资源安全”(想想数据库模块等等)而不是穿线,所以你可能想走那条路

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

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

在某些平台上,如Windows 其中fork()系统调用不可用 可用时,可以将Perl构建为 在解释器上模拟fork() 水平。而仿真是 设计为与其他设备一样兼容 可能是在 Perl程序的级别,有 某些重要的差异 源于所有的伪 以这种方式创建的子“进程” 尽可能地生活在同一个真实的过程中 就操作系统而言


哪一个最好在很大程度上取决于你的需要;但值得一提的是,以下是我的经验:

上次我使用perl的线程时,我发现它实际上比forking更慢,问题也更大,因为:

  • 线程复制了所有数据,就像线程一样,但都是预先完成的
  • 线程并不总是在退出时清理复杂的资源;造成了一个缓慢的内存泄漏,这在原本打算用作服务器的系统中是不可接受的
  • 有几个模块没有干净地处理线程,包括我正在使用的数据库模块,它被严重地弄糊涂了
需要注意的一个陷阱是“forks”库,它模拟“线程”,但使用真正的forking。我在这里面临的问题是,它模仿的许多行为正是我试图摆脱的。最后,我使用了一个经典的老式“fork”,并在需要的地方使用套接字进行通信

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

  • 仍然混淆了数据库系统
  • 共享变量仍然非常有限
  • 重写“fork”命令,导致软件中其他地方出现意外行为

Windows在线程模型方面做得最好,unix比Windows更能容忍进程创建。因此,您可能需要考虑OS,然后决定走叉与线程。fork()更容易编写IMO代码,但资源更密集。什么操作系统?好的,那么需要更多的信息:我在Linux上运行,我想我可以让主脚本收集数据库信息,然后发送每个子进程/任务来连接和收集信息,然后将信息推回到数据库。从Windows使用
fork
几乎没有问题。