【问题标题】:Multithreading perl script error多线程 perl 脚本错误
【发布时间】:2014-05-06 21:22:40
【问题描述】:

我正在使用多线程 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;
    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)  

请帮我解决这个问题。

【问题讨论】:

    标签: multithreading perl openldap


    【解决方案1】:

    首先,这不是错误,只是这个脚本的输出。你能粘贴实际的错误吗?

    您正在打印一个对象。为此使用 Data::Dumper。如果您对刚刚添加的 DN 感兴趣,请使用以下内容。

    Net::Ldap 不是线程安全的。您应该为每个线程创建一个新连接,或者您必须使用某种阻塞来确保在任何给定时间只有一个线程使用它。

    如果您使用 Net::Ldap 或在连接字符串中设置 on_error => 'die',请使用正确的错误检查。

    像这样改变doOperation:

    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();
        }  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-15
      • 2016-01-15
      • 2011-06-29
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多