Как удалить Parallel :: Forkmanager из моего Perl скрипта? - PullRequest
0 голосов
/ 20 января 2020

Я пару лет не играл в кодирование, и у меня нет опыта работы с Perl. У меня есть сценарий Perl, который я пытаюсь пройти, но часть его основана на Parallel::Forkmanager.

. В настоящий момент мне это не нужно, но я не знаю языка Perl достаточно хорошо, чтобы преобразовать эту часть моего кода в нечто, где он не полагается на Parallel::Forkmanager, хотя ответ, вероятно, очень прост.

PS: Я мог бы оставить это, но каким-то образом я не могу установить Parallel::Forkmanager также правильно, даже с советом, данным многими из вас по различным темам этого форума и других форумов ... Но это было бы будет другой вопрос. Пока я просто пытаюсь понять основы c 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";  ```


1 Ответ

2 голосов
/ 20 января 2020

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. Вы запускаете код между «start» и «fini sh». И тогда вы ждете, пока все закончится sh.

Между start и finish - на самом деле вы ничего не делаете, потому что это закомментировано.

Так что просто удалите весь этот блок и строку 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 способов параллельно. (Таким образом, вы можете ожидать, что это будет намного медленнее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...