2010-06-27 57 views
4

我對並行執行多個數據庫操作感興趣。我使用過Perl Parallel :: ForkManager,但沒有將它用於任何數據庫。我已經閱讀了這個數據庫連接是not supported very well。有人對此有經驗嗎?Perl Parallel ::具有DBI數據庫處理程序的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"; 

回答

7

如果工作是由其他程序完成的,還有就是fork沒有危險ING。當你打開一個到數據庫的連接然後fork的時候就會出現危險。孩子不能重複使用父母關係;但是,請看DBIx::Connector,它會處理您在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 
+0

這個腳本是否應該在Windows上運行? – MeirG 2016-12-06 11:08:44

+0

@MeirG由於Windows本身不支持分支(它與一些不同之處在於模擬),我不能肯定地說。我沒有可以測試的Windows機器,但是如果遇到任何問題,只要發佈出現問題的新問題即可。 – 2016-12-06 15:28:16

相關問題