繁体   English   中英

如何从我的 Perl 脚本中删除 Parallel::Forkmanager?

[英]How to remove Parallel::Forkmanager from my Perl script?

我已经退出编码游戏几年了,而且我没有使用 Perl 的经验。 我有一个我正在尝试通过的 Perl 脚本,但其中一部分基于Parallel::Forkmanager

目前我不需要这个,但我不太了解 Perl 的语言,无法将我的这部分代码转换成不依赖Parallel::Forkmanager ,即使答案可能非常简单。

PS:我可以保留它,但不知何故我也无法正确安装Parallel::Forkmanager ,即使你们中的许多人在本论坛和其他论坛的不同主题上给出了建议......但这将是另一个问题。 现在我只是想了解基本的 Perl。


use strict;
use warnings;
use Parallel::ForkManager;    <- so this is what I do not want


#From Dummyset:
my @samples = ("F1_A_S383_L007", "F1_B_S384_L007");

print "Processing " . scalar(@samples) . " samples\n";


### Trim adapters
unless (-d "skewer") {
    mkdir "skewer";
}

my @skewerCommands;
foreach my $sample (@samples) {
    my $R1 = "reads/" . $sample . "_R1_001.fastq.gz";
    my $R2 = "reads/" . $sample . "_R2_001.fastq.gz";

    my $adapterFile = "universal.adapters";

    # Make sure the adapter file exists
    unless (-e $adapterFile) {die "$adapterFile not present!\n";}

    my $skewerBaseName = "skewer/" . $sample;

    push(@skewerCommands, "<right_path_to>/skewer-0.2.2/skewer --quiet -x $adapterFile -m pe $R1 $R2 -L 150 -e -z -o $skewerBaseName");
}
#print "Running all skewer commands\n";
my $skewerFM = Parallel::ForkManager->new(46);    #this is where I do not know a solution
foreach my $skewerCommand(@skewerCommands) {
    $skewerFM->start and next;
#    print "Running the following command: \n$skewerCommand\n";
 #   system($skewerCommand);
    $skewerFM->finish;
}
$skewerFM->wait_all_children();
#print "Finished running all skewer commands\n";  ```


Parallel::Forkmanager是一个并行选项。 它可能是为了显着加速此代码的运行而加入的,如果再次将其取出 - 您可能会后悔。

但是 - 并行运行的核心部分在这里:

my $skewerFM = Parallel::ForkManager->new(46);    #this is where I do not know a solution
foreach my $skewerCommand(@skewerCommands) {
    $skewerFM->start and next;
#    print "Running the following command: \n$skewerCommand\n";
 #   system($skewerCommand);
    $skewerFM->finish;
}
$skewerFM->wait_all_children();

你实例化一个 forkmanager。 您在“开始”和“完成”之间运行代码。 然后你等待一切完成。

startfinish - 你实际上什么都不做,因为它被注释掉了。

所以只需删除整个块,并use Parallel::ForkManager; 线,你会没事的。

虽然,您可能想弄清楚$skewerCommand的用途,为什么它之前运行,以及为什么它现在不运行。

因为没有它,您基本上使整个代码变得多余。

但是,如果打算对此进行评论,则可以删除以下几行:

my $skewerFM = Parallel::ForkManager->new(46);    #this is where I do not know a solution
    $skewerFM->start and next;
    $skewerFM->finish;
$skewerFM->wait_all_children();

(和初始use线)。

然后您的代码将迭代@skewerCommands每一行并在每行上运行system命令 - 但会串行执行,而不是并行执行 46 种方式。 (所以你可以期望它会慢得多)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM