Multithreading 多线程perl脚本错误
我正在使用多线程perl脚本向ldap服务器添加条目。该脚本正在读取一些文件,然后向ldap数据库创建相应的条目。我的脚本如下:Multithreading 多线程perl脚本错误,multithreading,perl,openldap,Multithreading,Perl,Openldap,我正在使用多线程perl脚本向ldap服务器添加条目。该脚本正在读取一些文件,然后向ldap数据库创建相应的条目。我的脚本如下: #!/usr/bin/perl -w use strict; use warnings; use threads; use threads::shared; #use Thread::Queue; use POSIX; use Data::Dumper; use Net::LDAP;
#!/usr/bin/perl -w
use strict;
use warnings;
use threads;
use threads::shared;
#use Thread::Queue;
use POSIX;
use Data::Dumper;
use Net::LDAP;
use Net::LDAP::LDIF;
use Net::LDAP::Entry;
#my $q = Thread::Queue->new(); # A new empty queue
my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";
opendir(DIR, $INPUT_DIR) ;
my @files = grep { /^InputFile/ } readdir DIR;
my $count = @files;
print "Total Files: $count \n";
my @threads;
my $noofthread = 3;
my $nooffiles = $count;
my $noofbatch = $nooffiles / $noofthread;
print "No of batch1 : $noofbatch \n";
my $abc = $nooffiles % $noofthread;
print "ABC: $abc \n";
if (($nooffiles % $noofthread) > 0) {
$noofbatch = ceil($noofbatch);
}
print "No of batch2: $noofbatch \n";
my $ldap = '';
## Connect and bind to the server.
$ldap = Net::LDAP->new( '6873ZR1.egi.ericsson.com',
port => 389,
version => 3,
verify => 'optional',
cafile => '/etc/ldap/cacert.pem' ) or die $!;
## Bind to the server. The account must have sufficient privileges because you will
## be adding new entries.
my $result = $ldap->bind("administratorName=***,nodeName=***",
password => "***");
die $result->error() if $result->code();
# split the workload into N batches
#
while (my @batch = splice(@files, 0, $noofbatch)) {
#print "@batch \n";
push @threads, threads->new(\&doOperation, @batch);
}
for my $thr (@threads) {
#print "Ending Thread: $thr \n";
$thr->join;
}
sub doOperation () {
my $ithread = threads->tid() ;
print "Thread Index : [id=$ithread]\n" ;
my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";
foreach my $item (@_) {
my $filename = $INPUT_DIR.$item;
#print "Filename: $filename \n";
die "$filename not found!\n" unless ( -f $filename );
my $ldif = Net::LDAP::LDIF->new ($filename, "r") or die $!;
while ( ! $ldif->eof()) {
my $entry = $ldif->read_entry();
$result = $ldap->add($entry);
$result = $entry->add()->update( $ldap );
print "$filename : $result \n";
}
}
}
直到代码$result=$ldap->add($entry)代码>工作正常。但是当它到达行$result=$entry->add()->update($ldap)代码>显示以下错误:
eyacdel@6873ZR1:~/Documents/MM/Roger_SAPC/myscript$ perl thread_test1.pl
Total Files: 10
No of batch1 : 3.33333333333333
ABC: 1
No of batch2: 4
Thread Index : [id=1]
Thread Index : [id=2]
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF /InputFile1_5.ldif : Net::LDAP::Add=HASH(0x7fe86c006ba0)
Thread Index : [id=3]
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif : Net::LDAP::Add=HASH(0x7fe86c006cf0)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif : Net::LDAP::Add=HASH(0x7fe86c012568)
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif : Net::LDAP::Add=HASH(0x7fe868007e90)
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe864006ba0)
4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_5.ldif : Net::LDAP::Add=HASH(0x161e500)
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif : Net::LDAP::Add=HASH(0x7fe868007fe0)
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe864006cf0)
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif : Net::LDAP::Add=HASH(0x161e4b8)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif : Net::LDAP::Add=HASH(0x7fe868012600)
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif : Net::LDAP::Add=HASH(0x7fe86c006bd0)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe864012640)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif : Net::LDAP::Add=HASH(0x7fe86c004ed0)
4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif : Net::LDAP::Add=HASH(0x7fe8680126d8)
4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe864012718)
5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_4.ldif : Net::LDAP::Add=HASH(0x7fe8680127b0)
4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif : Net::LDAP::Add=HASH(0x7fe86c004fa8)
5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_10.ldif : Net::LDAP::Add=HASH(0x7fe86c004e10)
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif : Net::LDAP::Add=HASH(0x161e608)
1 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif : Net::LDAP::Add=HASH(0x1d6e9d8)
5 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe864014d60)
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif : Net::LDAP::Add=HASH(0x7fe868007e30)
6 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_6.ldif : Net::LDAP::Add=HASH(0x7fe8640152c0)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif : Net::LDAP::Add=HASH(0x7fe868012810)
2 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif : Net::LDAP::Add=HASH(0x7fe86c006bd0)
4 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_2.ldif : Net::LDAP::Add=HASH(0x7fe868015398)
3 --> /home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/InputFile1_1.ldif : Net::LDAP::Add=HASH(0x7fe86c004ea0)
请帮助我解决此问题。首先,这不是错误,只是此脚本的输出。你能粘贴实际的错误吗
您正在打印一个对象。为此,请使用Data::Dumper。如果您对刚才添加的DN感兴趣,请使用下面的
Ldap不是线程安全的。您应该为每个线程创建一个新连接,或者必须使用某种阻塞,以确保在给定时间内只有一个线程使用它
如果在连接字符串中使用Net::Ldap或安装程序,请使用正确的错误检查
更改操作如下:
sub doOperation () {
my $ithread = threads->tid() ;
print "Thread Index : [id=$ithread]\n" ;
my $INPUT_DIR="/home/eyacdel/Documents/MM/Roger_SAPC/myscript/IMPORTLDIF/";
foreach my $item (@_) {
my $filename = $INPUT_DIR.$item;
#print "Filename: $filename \n";
die "$filename not found!\n" unless ( -f $filename );
my $ldap = connect_ldap();### Create a sub for ldap connect
my $ldif = Net::LDAP::LDIF->new ($filename, "r") or die $!;
while ( ! $ldif->eof()) {
my $entry = $ldif->read_entry();
$result = $ldap->add($entry);
$result = $entry->add()->update( $ldap );
print "tid: $ithread\t$filename: ".$result->code."\tdn: ".$entry-dn()."\n";
die "Error: ".$result->code() if $result->code();
}
$ldif->done();
$ldap->disconnect();
}
}