Perl үшін бірнеше өңдеу модулі бар ма?

Perl үшін бірнеше өңдеу модулі бар ма? Python-тың мультипроцессорлық модулі ұсынған нәрсеге ұқсас функция бар нәрсе.

Мен Perl-ды пайдалана отырып, ұқсас функционалды құра алатынымды түсінемін, бірақ қазірдің өзінде іске асырылған нәрсені іздеймін.

11
@PlatinumAzure «Қате бөлік « Көптеген өңдеу пакеті жергілікті және қашықтағы бір мезгілде бірдей ұсынады », қашықтан басқару бөлігіне тасымалданатын абстракцияның бар-жоғын білмеймін.
қосылды автор Sinan Ünür, көзі
Фордан басқа() сізде Perl (осы қолдау үшін жасалған) деп аталатын ағындар бар. Қараңыз 'perlthrtut' DOC
қосылды автор JRFerguson, көзі
Ия, мен оны сұраққа қосып қойдым.
қосылды автор jkysam, көзі
Perl-дің fork және exec сөзінің қораптағы екенін ұмытпаңыз.
қосылды автор Platinum Azure, көзі
@ SinanÜnür Әрине, әрине.
қосылды автор Platinum Azure, көзі
CPAN сонымен қатар Parallel :: Pvm - Perl кеңейту үшін ұсынады Виртуальды машина (PVM) хабарын жіберу жүйесі . Менде тәжірибе жоқ. Сіз іздеген қашықтан басқару процесін басқаратын сияқтысыз.
қосылды автор MetaEd, көзі
Егер мен қашықтан параллельдікті қажет етсе, мен Gearman :: XS тәрізді бір нәрсеге көз жүгірте бастаймын. Жергілікті болса, процестерді басқару үшін fork/exec немесе Parallel :: ForkManager болуы мүмкін.
қосылды автор runrig, көзі

3 жауаптар

Менің ойымша, Forks :: Super өте жақын келеді. Фондық процесте ерікті кіші режимін (немесе сыртқы команда) іске қосу, өңдік процесті бақылау және сигнал беру және бірнеше тілдесу процесін біршама аз ауыртпалыққа айналдыру үшін бірнеше мүмкіндіктер бар.

use Forks::Super;

sub do_something { my @args = @_; ... }
$process = fork { sub => \&do_something, args => [@args] };
$process->wait;


my $x = 42;
my @y = ();
my %z = ();
sub do_something_else {
    $x = 19;
    @y = qw(foo bar);
    %z = (foo => 'bar');
}
$process = fork { sub => 'do_something_else', share => [\$x, \@y, \%z ] };
$process->wait;
# $x, @y, and %z are now updated with changes made in background process


# create your own pipes to use for IPC
use IO::Handle;
pipe my $child_read, my $parent_write;
pipe my $parent_read, my $child_write;
$parent_write->autoflush(1);
$child_write->autoflush(1);
sub square {
    while (my $x = <$child_read>) {
        print {$child_write} $x ** 2, "\n";
    }
    close $child_write;
}
$process = fork { sub => 'square' };
print {$parent_write} "9\n";
my $result = <$parent_read>;    # should be "81\n";
close $parent_write;

# or use the standard I/O handles for IPC
sub square_root {
    sleep 1 && seek STDIN,0,1 while eof(STDIN); # ok, this is a workaround for an existing bug :-(
    while (my $x = ) {
        print sqrt($x), "\n";
    }
}
$process = fork { sub => 'square_root', child_fh => 'in,out,block' };
$process->write_stdin("81\n");
$result = $process->read_stdout(); #  =>  "9\n"

multiprocessing және Forks :: Super модульдерінің екеуінде де көптеген мүмкіндіктер бар. Қандайлар сізді қызықтырады?

Мен Forks :: Super авторымынмын және менің мақсатым - адамдар пайдалы деп тапқан параллельді өңдеуге арналған кез-келген мүмкіндіктерді қосу, сондықтан сізде multiprocessing Перл, маған хабарлаңыз.

11
қосылды
Бұл мен іздейтін нәрсе. Мен осы тапсырманы алдымыздағы Perl сценарийлерінде уақытты жақсарту үшін параллелизм қосуды жөн көрдік. Мен бұған дейін Python-тің көп өңделуін қолданғанмын, бірақ Perl-де осындай ештеңе жоқ. Сценарийлерді түрлендіре бастағанда, мен нақты мәселелерге ие боламын.
қосылды автор jkysam, көзі
Міне, бұл модуль менің Perl-ге орнатылғанын тексердім, және, мүмкін, олай емес. Маған ұнайтын нәрселер, мысалы, Perl-ның стандартты пакетінің бөлігі. :(
қосылды автор antred, көзі

forks provides the same awesome interface as threads, but uses processes instead of threads.

use forks;  # Or: use threads;
use Thread::Queue;

my $q = Thread::Queue->new();

my @workers;
for (1..NUM_WORKERS) {
   push @workers, async {
      while (defined(my $job = $q->dequeue())) {
         ...
      }
   };
}

$q->enqueue(...);

$q->enqueue(undef) for @workers;
$_->join for @workers;

Forks :: Super сақинасын салыстыру.

Есіңізде болсын, бұл жағдайлар Forks :: Super excels!

use Forks::Super;
sub do_something { my @args = @_; ... }
$process = fork { sub => \&do_something, args => [@args] };
$process->wait;

ретінде жазуға болады

use forks;
sub do_something { my @args = @_; ... }
$process = async { do_something(@args) };
$process->join;

---

use Forks::Super;
my $x = 42;
my @y = ();
my %z = ();
sub do_something_else {
    $x = 19;
    @y = qw(foo bar);
    %z = (foo => 'bar');
}
$process = fork { sub => 'do_something_else', share => [\$x, \@y, \%z ] };
$process->wait;

ретінде жазуға болады

use forks;
use forks::shared;
my $x :shared = 42;
my @y :shared = ();
my %z :shared = ();
sub do_something_else {
    $x = 19;
    @y = qw(foo bar);
    %z = (foo => 'bar');
}
$process = async { do_something_else() };
$process->join;

---

use Forks::Super;
use IO::Handle;
pipe my $child_read, my $parent_write;
pipe my $parent_read, my $child_write;
$parent_write->autoflush(1);
$child_write->autoflush(1);
sub square {
    while (my $x = <$child_read>) {
        chomp($x);
        print {$child_write} $x ** 2, "\n";
    }
    close $child_write;
}
$process = fork { sub => 'square' };
print { $parent_write } "9\n";
chomp( my $result = <$parent_read> );  # 81
close $parent_write;
$process->wait;

ретінде жазуға болады

use forks;
use Threads::Queue;
my $req = Threads::Queue->new();
my $resp = Threads::Queue->new();
sub square { $_[0] ** 2 }
$process = async {
    while (defined(my $x = $req->dequeue())) {
        $resp->enqueue( square($x) );
    }
};
$req->enqueue(9);
my $result = $resp->dequeue();  # 81
$resp->enqueue(undef);
$process->join;

---

use Forks::Super;
sub square_root {
    sleep 1 && seek STDIN,0,1 while eof(STDIN); # ok, this is a workaround for an existing bug :-(
    while (my $x = ) {
        chomp($x);
        print sqrt($x), "\n";
    }
}
$process = fork { sub => 'square_root', child_fh => 'in,out,block' };
$process->write_stdin("81\n");
chomp( $result = $process->read_stdout() );  # 9
$process->close_fh('stdin');
$process->wait;

ретінде жазуға болады

use forks;
use Threads::Queue;
my $req = Threads::Queue->new();
my $resp = Threads::Queue->new();
$process = async {
    while (defined(my $x = $req->dequeue())) {
        $resp->enqueue( sqrt($x) );
    }
};
$req->enqueue(81);
my $result = $resp->dequeue();  # 9
$resp->enqueue(undef);
$process->join;
10
қосылды
@jkysam, Forks және Super Forces супер салыстыру қосылды.
қосылды автор ikegami, көзі

POE: Perl нысан ортасы туралы не деуге болады? Асинхронды балалар процестерін қолдайды.

3
қосылды