Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有DBI数据库处理程序的Perl Parallel::ForkManager_Perl_Dbi_Parallel Processing - Fatal编程技术网

带有DBI数据库处理程序的Perl Parallel::ForkManager

带有DBI数据库处理程序的Perl Parallel::ForkManager,perl,dbi,parallel-processing,Perl,Dbi,Parallel Processing,我对并行执行多个数据库操作感兴趣。我已经使用过Perl Parallel::ForkManager,但还没有在任何数据库中使用它。我已经读到数据库连接与此相关。有人有这方面的经验吗 作为一个例子,我可能会生成一个系统调用,它不使用原始代码,而使用DBI #!/opt/local/bin/perl -w use strict; use Parallel::ForkManager; $| = 1; my $max_procs = 10; my $pm = new Parallel::For

我对并行执行多个数据库操作感兴趣。我已经使用过Perl Parallel::ForkManager,但还没有在任何数据库中使用它。我已经读到数据库连接与此相关。有人有这方面的经验吗

作为一个例子,我可能会生成一个系统调用,它不使用原始代码,而使用DBI

#!/opt/local/bin/perl -w

use strict;
use Parallel::ForkManager;

$| = 1;

my $max_procs = 10;

my $pm =  new Parallel::ForkManager($max_procs);

for (my $var = 0; $var <= 10; $var++) {
  my $pid = $pm->start('proc'.$var) and next;
  sleep ( 2 );
  system( "./DBworker.pl $var" );
  $pm->finish(0); 
}

print "Waiting for child procs\n";
$pm->wait_all_children;
print "complete!\n";

如果工作是由其他程序完成的,那么分叉就没有危险。当您打开与数据库的连接,然后使用fork时,危险就来了。孩子不能重复使用父母连接;但是,看看,在为您分叉并运行多个程序之后,它处理您需要做的事情通常不是正确的答案

#!/usr/bin/perl

use strict;
use warnings;

use DBIx::Connector;
use Parallel::ForkManager;

my $dsn  = "dbi:SQLite:dbname=foo.db";
my $user = "";
my $pass = "";
my $conn = DBIx::Connector->new($dsn, $user, $pass, 
    {
        AutoCommit       => 0,
        PrintError       => 0,
        RaiseError       => 1,
        ChopBlanks       => 1,
        FetchHashKeyName => 'NAME_lc',
    }
);
END { unlink "foo.db" }

#setup table
$conn->run(fixup => sub {
    my $dbh = $_;
    $dbh->do("create table foo ( id integer, name char(35) )");
    my $sth = $dbh->prepare("insert into foo (id, name) values (?, ?)");
    while (<DATA>) {
        chomp;
        $sth->execute(split /,/);
    }
});

my $pm = Parallel::ForkManager->new(3);

my $sth = $conn->dbh->prepare("select * from foo where id = ?");
for my $id (1 .. 3) {
    next if $pm->start;
    $sth->execute($id);
    while (my $row = $sth->fetchrow_hashref) {
        print "$id saw $row->{id} => $row->{name}\n";
    }
    $pm->finish;
}

$pm->wait_all_children;

print "done\n";

__DATA__
1,foo
2,bar
3,baz

这个脚本也应该在Windows上运行吗?@MeirG因为Windows本机不支持fork,所以模拟它时有一些不同,我不能肯定。我没有一台Windows机器可以测试,但是如果你遇到任何问题,就把出了什么问题作为一个新问题发布出来。