Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Fast provider feeding slow consumer

by BrowserUk (Patriarch)
on Apr 25, 2016 at 00:20 UTC ( [id://1161410]=note: print w/replies, xml ) Need Help??


in reply to Fast provider feeding slow consumer

Here's how I do it with threads. One thread runs the sever; 10 do the smp walking; the main thread populates the database.

(No clean up code because it wasn't clear from your code what caused things to stop? Compiles clean; but untested.)

#! perl -slw use strict; use threads; use Thread::Queue; our $T //= 10; ## 10 walkers; adjust to suit. sub listener { my( $Qout ) = @_; require 'IO::Socket::INET::Daemon'; ## Requiring here means othe +r threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; while( $Qin->dequeue ) { ## receive work from listener my( $type, $ip, $mac, $bsid, $datecode ) = split( ',', $_ ); $mac =~ tr[-][]d; my $output = qx( snmpwalk -v2c -t1 -c public $ip .1.3.6.1.4.1. +9885.9885.1.2.0 2>&1 ); my( $rssi, $error ) = 0; if( $output eq "Timeout: No Response from $ip" ) { $error = 'SNMP not responding. Upgrade firmware'; } else { my @result = split( /:/, $output ); $rssi = $result[ 3 ]; $rssi =~ tr[ \n][]d; if( $rssi < -100 ) { $rssi = $rssi / 100; } $rssi = int( $rssi ); } $Qout->enqueue( join $;, $mac, $ip, $bsid, $rssi ); + ## Send data items to DBI as one scalar } } use enum qw[ IN DBI ]; my @Qs = map Thread::Queue->new(), 1 .. 2; + ## set up two Qs ## start the listener thread my $tListener = threads->create( \&listener, $Qs[ IN ] ); + ## One for the listener to send work to the walkers ## start 10 walkers my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI ] ) } 1 .. +$T; ## And one for the walkers to forward data for adding to the db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect( "DBI:mysql:database=cpe_info;host=172.24.3.207 +;port=3306","account_process","neting.!" ); my $sth = $dbh->prepare( "INSERT INTO cpe_info(mac,ip,bsid,rssi) VALU +ES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = ?" +); ## process data produced by walkers while( $Qs[DBI]->dequeue ) { my( $mac, $ip, $bsid, $rssi ) = split $;; + ## Retrieve individual data $sth->execute( $mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi ); + ## bind and execute } $dbh->disconnect(); __END__

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Fast provider feeding slow consumer
by marioroy (Prior) on Apr 25, 2016 at 15:02 UTC

    Update: Renamed an enum constant from DBI to DB. Thank you NetWallah.

    When Perl lacks threads support, e.g. Perl on Solaris, AIX, one may use MCE::Hobo in place of threads for BrowserUk's demonstration.

    A Hobo is a migratory worker inside the machine that carries the asynchronous gene. Hobos are equipped with threads-like capabilities for running code asynchronously. Unlike threads, each hobo is a unique process to the underlying OS. The IPC is managed by MCE::Shared, which runs on all the major platforms including Windows and Cygwin.

    #! perl -slw use strict; use MCE::Hobo; use MCE::Shared; our $T //= 10; ## 10 walkers; adjust to suit. sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; while( $Qin->dequeue ) { ## receive work from listener my( $type, $ip, $mac, $bsid, $datecode ) = split( ',', $_ ); $mac =~ tr[-][]d; my $output = qx( snmpwalk -v2c -t1 -c public $ip .1.3.6.1.4.1. +9885.9885.1.2.0 2>&1 ); my( $rssi, $error ) = 0; if( $output eq "Timeout: No Response from $ip" ) { $error = 'SNMP not responding. Upgrade firmware'; } else { my @result = split( /:/, $output ); $rssi = $result[ 3 ]; $rssi =~ tr[ \n][]d; if( $rssi < -100 ) { $rssi = $rssi / 100; } $rssi = int( $rssi ); } $Qout->enqueue( join $;, $mac, $ip, $bsid, $rssi ); + ## Send data items to DBI as one scalar } } use enum qw[ IN DB ]; my @Qs = map MCE::Shared->queue(), 1 .. 2; + ## set up two Qs ## start the listener thread my $tListener = MCE::Hobo->create( \&listener, $Qs[ IN ] ); + ## One for the listener to send work to the walkers ## start 10 walkers my @walkers = map{ MCE::Hobo->create( \&walker, @Qs[ IN, DB ] ) } 1 .. + $T; ## And one for the walkers to forward data for adding to the db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect( "DBI:mysql:database=cpe_info;host=172.24.3.207 +;port=3306","account_process","neting.!" ); my $sth = $dbh->prepare( "INSERT INTO cpe_info(mac,ip,bsid,rssi) VALU +ES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = ?" +); ## process data produced by walkers while( $Qs[ DB ]->dequeue ) { my( $mac, $ip, $bsid, $rssi ) = split $;; + ## Retrieve individual data $sth->execute( $mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi ); + ## bind and execute } $dbh->disconnect(); __END__
Re^2: Fast provider feeding slow consumer
by marioroy (Prior) on Apr 25, 2016 at 14:39 UTC

    BrowserUk's cool demonstration is working after removing the quotes for the require statement on line 10.

    sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight ... }
Re^2: Fast provider feeding slow consumer
by leostereo (Beadle) on Apr 25, 2016 at 13:40 UTC
    Dear BrowserUk; I can not believe you wrote this script for me, I really apreciate your effort on this and of course I will try and back to you with the result.
    Regarding your question about what was wrong with my script, let me explain.
    The current script I posted on this node is working good, I wanted to share it since it is the first time I use those modules and I wanted to get some comments/advices from you.
    The problem I had with my previous script using fork on the production server is that CPU goes to %100.
    It was very weird since running on the testing server it was working good, perhaps it was due to a difference on the OS architecuture , signal handling ... dont know, but decided to try other ways.
    Any way , thanks for your time and patience.
    Regards.
    Leandro.
Re^2: Fast provider feeding slow consumer
by leostereo (Beadle) on Apr 26, 2016 at 14:08 UTC

    Dear BrowserUk , the script is almost done, After applying both changes it begun working, but there is something wrong when the walker receives the line from the listener, it receives only a number instead of the complete line.
    I put them to print as following:

    sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; print "here line is : $line"; $Qout->enqueue( $line ); ## send work to listener return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; while( $Qin->dequeue ) { ## receive work from listener print "here \$\_ is : $_"; my( $type, $ip, $mac, $bsid, $datecode ) = split( ',', $_ ); $mac =~ tr[-][]d;
    and got the following:
    here line is : 2,190.115.32.180,00-21-07-2E-DD-6A,000044000070,20160426105156,D
    here $_ is : 7
    Use of uninitialized value in transliteration (tr///) at ./lines_dispacher_and_consumer_threads.pl line 34.
    Use of uninitialized value $ip
    ....
    ...
    ..
    .

    Im reading the Thread::Queue documentacion and the example provided looks very similar like your method ... I will keep investigating it. Thanks

      it receives only a number instead of the complete line.

      I have really no idea how that could possibly happen; nor do I see anything in the code you posted that would explain it.

      If you haven't already solved it; please post the full code that demonstrates the problem and I'll try and re-create it here.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Same reply , but this time im logged in ... sorry for that.
        Dear BrowserUk
        Following , the current running code.
        Please note that
        . Since there is still some queries that returns empty values, I must check the result before sending to the db queue.
        When querie returns empty rssi , I put in the queue back and it takes between 3-8 times to get a valid value.
        I also introduce some delay, in order to avoid a loop in this process.
        In comment at line 28 , Im asking if are they going to the walker instead ?
        That's all
        . Leandro.
        #!/usr/bin/perl -slw use strict; use threads; use Thread::Queue; our $T = 20; ## 10 walkers; adjust to suit. my $cpe; my $community; my $snmp_rssi; my $output; my $error = 'none'; my $rssi; my @result; my $line; sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener ( +is not sending to walker ?) return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; # while( $Qin->dequeue ) { ## receive work from listener while (defined(my $item = $Qin->dequeue())) { ## receive work from + listener #print "here \$\_ is : $item"; ### my ($type, $ip, $mac, $bsid, $datecode) = split(',', $item); print "on walker we have $ip | $mac | $bsid\n"; $cpe=$ip; $mac=~s/-//g; $community='public'; $output=qx(snmpwalk -v2c -t1 -c $community $cpe $snmp_rssi + 2>&1); if( $output eq "Timeout: No Response from $ip" ) { $rssi=0; $error='SNMP not responding. Upgrade firmware'; } else { @result=split(/:/,$output); $rssi=$result[3]; $rssi=~s/ //g; $rssi=~s/\n//g; if($rssi < -100) { $rssi=$rssi/100; } $rssi=int($rssi); } if(($mac ne '') && ($rssi ne '')){ #### I must check rssi in +order to avoid introducing empty values on db. $Qout->enqueue(join(',',$mac,$ip,$bsid,$rssi));## data + items to DBI }else{ $line = join(',',$type,$ip,$mac,$bsid); print "will reenqueue $line\n"; sleep(5); $Qin->enqueue($line); } } } use enum qw[ IN DBI_ENUM ]; my @Qs = map Thread::Queue->new(), 1 .. 2; # set up two Qs ## start the listener thread my $tListener = threads->create( \&listener, $Qs[ IN ] ); ## One for t +he listener to send work to the walkers ## start 10 walkers my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI_ENUM ] ) } +1 .. $T; ## And one for the walkers to forward data for adding to the + db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect("DBI:mysql:database=cpe_info;host=172.24.3.207; +port=3306","account_process","neting.!" ); my $sth = $dbh->prepare("INSERT INTO cpe_info(mac,ip,bsid,rssi) VALUE +S (?, ?, ?, ?) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = +?"); ## process data produced by walkers #while( $Qs[DBI_ENUM]->dequeue ) { while (defined(my $item = $Qs[DBI_ENUM]->dequeue())) { ## receive +work from listener my($mac, $ip, $bsid, $rssi) = split(',', $item); #Retrieve individ +ual data print "in db task item is $item"; $sth->execute($mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi); + ## bind and execute } $dbh->disconnect();
        Dear BrowserUk
        Following , the current running code.
        Please note that
        . Since there is still some queries that returns empty values, I must check the result before sending to the db queue.
        When querie returns empty rssi , I put in the queue back and it takes between 3-8 times to get a valid value.
        I also introduce some delay, in order to avoid a loop in this process.
        In comment at line 28 , Im asking if are they going to the walker instead ?
        That's all
        . Leandro.
        #!/usr/bin/perl -slw use strict; use threads; use Thread::Queue; our $T = 20; ## 10 walkers; adjust to suit. my $cpe; my $community; my $snmp_rssi; my $output; my $error = 'none'; my $rssi; my @result; my $line; sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener ( +is not sending to walker ?) return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; # while( $Qin->dequeue ) { ## receive work from listener while (defined(my $item = $Qin->dequeue())) { ## receive work from + listener #print "here \$\_ is : $item"; ### my ($type, $ip, $mac, $bsid, $datecode) = split(',', $item); print "on walker we have $ip | $mac | $bsid\n"; $cpe=$ip; $mac=~s/-//g; $community='public'; $output=qx(snmpwalk -v2c -t1 -c $community $cpe $snmp_rssi + 2>&1); if( $output eq "Timeout: No Response from $ip" ) { $rssi=0; $error='SNMP not responding. Upgrade firmware'; } else { @result=split(/:/,$output); $rssi=$result[3]; $rssi=~s/ //g; $rssi=~s/\n//g; if($rssi < -100) { $rssi=$rssi/100; } $rssi=int($rssi); } if(($mac ne '') && ($rssi ne '')){ #### I must check rssi in +order to avoid introducing empty values on db. $Qout->enqueue(join(',',$mac,$ip,$bsid,$rssi));## data + items to DBI }else{ $line = join(',',$type,$ip,$mac,$bsid); print "will reenqueue $line\n"; sleep(5); $Qin->enqueue($line); } } } use enum qw[ IN DBI_ENUM ]; my @Qs = map Thread::Queue->new(), 1 .. 2; # set up two Qs ## start the listener thread my $tListener = threads->create( \&listener, $Qs[ IN ] ); ## One for t +he listener to send work to the walkers ## start 10 walkers my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI_ENUM ] ) } +1 .. $T; ## And one for the walkers to forward data for adding to the + db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect("DBI:mysql:database=cpe_info;host=172.24.3.207; +port=3306","account_process","neting.!" ); my $sth = $dbh->prepare("INSERT INTO cpe_info(mac,ip,bsid,rssi) VALUE +S (?, ?, ?, ?) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = +?"); ## process data produced by walkers #while( $Qs[DBI_ENUM]->dequeue ) { while (defined(my $item = $Qs[DBI_ENUM]->dequeue())) { ## receive +work from listener my($mac, $ip, $bsid, $rssi) = split(',', $item); #Retrieve individ +ual data print "in db task item is $item"; $sth->execute($mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi); + ## bind and execute } $dbh->disconnect();
        Dear BrowserUk , this is currently running code.
        Regards,
        Leo.
        #!/usr/bin/perl -slw use strict; use threads; use Thread::Queue; our $T = 20; ## 10 walkers; adjust to suit. my $cpe; my $community; my $snmp_rssi; my $output; my $error = 'none'; my $rssi; my @result; my $line; sub listener { my( $Qout ) = @_; require IO::Socket::INET::Daemon; ## Requiring here means other +threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener ( +is not sending to walker ?) return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; # while( $Qin->dequeue ) { ## receive work from listener while (defined(my $item = $Qin->dequeue())) { ## receive work from + listener #print "here \$\_ is : $item"; ### my ($type, $ip, $mac, $bsid, $datecode) = split(',', $item); print "on walker we have $ip | $mac | $bsid\n"; $cpe=$ip; $mac=~s/-//g; $community='public'; $output=qx(snmpwalk -v2c -t1 -c $community $cpe $snmp_rssi + 2>&1); if( $output eq "Timeout: No Response from $ip" ) { $rssi=0; $error='SNMP not responding. Upgrade firmware'; } else { @result=split(/:/,$output); $rssi=$result[3]; $rssi=~s/ //g; $rssi=~s/\n//g; if($rssi < -100) { $rssi=$rssi/100; } $rssi=int($rssi); } if(($mac ne '') && ($rssi ne '')){ #### I must check rssi in +order to avoid introducing empty values on db. $Qout->enqueue(join(',',$mac,$ip,$bsid,$rssi));## data + items to DBI }else{ $line = join(',',$type,$ip,$mac,$bsid); print "will reenqueue $line\n"; sleep(5); $Qin->enqueue($line); } } } use enum qw[ IN DBI_ENUM ]; my @Qs = map Thread::Queue->new(), 1 .. 2; # set up two Qs ## start the listener thread my $tListener = threads->create( \&listener, $Qs[ IN ] ); ## One for t +he listener to send work to the walkers ## start 10 walkers my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI_ENUM ] ) } +1 .. $T; ## And one for the walkers to forward data for adding to the + db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect("DBI:mysql:database=cpe_info;host=172.24.3.207; +port=3306","account_process","neting.!" ); my $sth = $dbh->prepare("INSERT INTO cpe_info(mac,ip,bsid,rssi) VALUE +S (?, ?, ?, ?) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = +?"); ## process data produced by walkers #while( $Qs[DBI_ENUM]->dequeue ) { while (defined(my $item = $Qs[DBI_ENUM]->dequeue())) { ## receive +work from listener my($mac, $ip, $bsid, $rssi) = split(',', $item); #Retrieve individ +ual data print "in db task item is $item"; $sth->execute($mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi); + ## bind and execute } $dbh->disconnect();

        Please note:
        It is still returning some empty values so Im checking and re-enqueueing , the lines for the one the query did not work, It takes between 3-8 times to get a valid value.
        Im thinking about preparing another subroutine to process those wrong lines.
        I also put a little delay just to avoid a loop in the process
        On line 28 , a ask if the comment is ok
        Ok, That is all. Thanks.

      Ok , the script is working , there is one good and one bad news. The bad news is that there is 1 on 10 aprox snmp queries that returns empty rssi values.
      (I manually cheked that device is alive and can process snmp queries).
      I tryed incrementing the number of workers to 20 but it has no effect.
      I wonder if is it possible to put those empty lines back on the walkers queue.
      The good news is that the processor load is 8 times less thant the script at the begining of this post.
      I need to read/learn about why threads are much efficient than fork/prefork.
      O .... lets try.
      And ...
      Thanks fo everything!

Re^2: Fast provider feeding slow consumer
by leostereo (Beadle) on Apr 25, 2016 at 15:34 UTC

    Dear BrowserUk; I made some minor modifications to test it but can not make it run yet.
    I wrote:

    #!/usr/bin/perl -slw use strict; use threads; use Thread::Queue; our $T = 10; ## 10 walkers; adjust to suit. sub listener { my( $Qout ) = @_; require 'IO::Socket::INET::Daemon'; ## Requiring here means othe +r threads don't carry the redundant weight my $host = new IO::Socket::INET::Daemon( host => '172.24.3.208', port => 7777, timeout => 20, callback => { data => sub { my ($io, $host) = @_; chomp( my $line = <$io> ); return 0 unless $line; $Qout->enqueue( $line ); ## send work to listener # +#-> aren't going to the walker ? return !0; } }, ); $host->run; return; } sub walker { my( $Qin, $Qout ) = @_; while( $Qin->dequeue ) { ## receive work from listener my( $type, $ip, $mac, $bsid, $datecode ) = split( ',', $_ ); $mac =~ tr[-][]d; my $output = qx( snmpwalk -v2c -t1 -c public $ip .1.3.6.1.4.1. +9885.9885.1.2.0 2>&1 ); my( $rssi, $error ) = 0; if( $output eq "Timeout: No Response from $ip" ) { $error = 'SNMP not responding. Upgrade firmware'; } else { my @result = split( /:/, $output ); $rssi = $result[ 3 ]; $rssi =~ tr[ \n][]d; if( $rssi < -100 ) { $rssi = $rssi / 100; } $rssi = int( $rssi ); } $Qout->enqueue( join $;, $mac, $ip, $bsid, $rssi ); ## Send +data items to DBI as one scalar } } use enum qw[ IN DBI ]; my @Qs = map Thread::Queue->new(), 1 .. 2; # set up two Qs ## start the listener thread my $tListener = threads->create( \&listener, $Qs[ IN ] ); ## One for t +he listener to send work to the walkers ## start 10 walkers my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI ] ) } 1 .. +$T; ## And one for the walkers to forward data for adding to the db require DBI; ## Avoid loading DBI into threads my $dbh = DBI->connect("DBI:mysql:database=cpe_info;host=172.24.3.207; +port=3306","account_process","neting.!" ); my $sth = $dbh->prepare("INSERT INTO cpe_info(mac,ip,bsid,rssi) VALUE +S( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE ip = ?, bsid = ?, rssi = ?"); ## process data produced by walkers while( $Qs[DBI]->dequeue ) { my( $mac, $ip, $bsid, $rssi ) = split $;; ## +Retrieve individual data $sth->execute( $mac, $ip, $bsid, $rssi, $ip, $bsid, $rssi ); ## +bind and execute } $dbh->disconnect();

    It yields:

    ./lines_dispacher_and_consumer_threads.pl Thread 1 terminated abnormally: Can't locate IO::Socket::INET::Daemon +in @INC (@INC contains: /root/perl5/lib/perl5/5.16.3/x86_64-linux-thr +ead-multi /root/perl5/lib/perl5/5.16.3 /root/perl5/lib/perl5/x86_64-l +inux-thread-multi /root/perl5/lib/perl5 /usr/local/lib64/perl5 /usr/l +ocal/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor +_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./lines_dispacher_and_c +onsumer_threads.pl line 10. Can't call method "connect" without a package or object reference at . +/lines_dispacher_and_consumer_threads.pl line 65. Perl exited with active threads: 10 running and unjoined 1 finished and unjoined 0 running and detached

    Very strange , IO::Socket::INET::Daemon is at /usr/local/share/perl5 folder , I have used it with no problem. The other error is about the dbh=DBI->connect line ... also ver strange. I have been playing around with both modules declaration statements but still can not make it work ... I will keep trying.
    Regards.
    Leandro.

      The error appears to occur due to the fact that the code uses "DBI" both as an ENUM and a module name. Try changing these 2 lines:
      use enum qw[ IN DBI_ENUM ]; # *CHANGED* my @Qs = map Thread::Queue->new(), 1 .. 2; # set up two Qs ... ## start 10 walkers # *CHANGED* next line my @walkers = map{ threads->create( \&walker, @Qs[ IN, DBI_ENUM ] ) } +1 .. $T; ##

              This is not an optical illusion, it just looks like one.

        Ditto for line # 70. Thank you NetWallah.

        ## process data produced by walkers while( $Qs[ DBI_ENUM ]->dequeue ) { ... }

      marioroy seems to have identified the first error, and netwallah the second.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1161410]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2024-04-18 07:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found