Perl Parallel ::具有DBI数据库处理程序的ForkManager
发布时间:2020-12-16 06:20:18 所属栏目:大数据 来源:网络整理
导读:我有兴趣并行执行多个数据库操作.我玩过Perl Parallel :: ForkManager,但还没有用过任何数据库.我已经读过这个数据库连接是 not supported very well.有任何人对此有经验吗? 作为一个例子,我可能会产生一个系统调用(它使DBI工作)不是原始代码,即 #!/opt/loc
我有兴趣并行执行多个数据库操作.我玩过Perl Parallel :: ForkManager,但还没有用过任何数据库.我已经读过这个数据库连接是
not supported very well.有任何人对此有经验吗?
作为一个例子,我可能会产生一个系统调用(它使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 procsn"; $pm->wait_all_children; print "complete!n"; 解决方法
如果其他程序正在完成工作,那么分叉就没有危险.当您打开与数据库的连接然后fork时,会出现危险.孩子不能重复使用父母的联系;但是,看看
DBIx::Connector ,它处理你需要做的事情,并且运行多个程序通常不是正确的答案.
#!/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 "donen"; __DATA__ 1,foo 2,bar 3,baz (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |