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.
In the absence of evidence, opinion is indistinguishable from prejudice.
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__
| [reply] [d/l] |
Re^2: Fast provider feeding slow consumer
by marioroy (Prior) on Apr 25, 2016 at 14:39 UTC
|
sub listener {
my( $Qout ) = @_;
require IO::Socket::INET::Daemon; ## Requiring here means other
+threads don't carry the redundant weight
...
}
| [reply] [d/l] |
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.
| [reply] |
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 | [reply] [d/l] |
|
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.
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
|
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();
| [reply] [d/l] |
|
|
|
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();
| [reply] [d/l] |
|
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. | [reply] [d/l] |
|
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!
| [reply] |
Re^2: Fast provider feeding slow consumer
by leostereo (Beadle) on Apr 25, 2016 at 15:34 UTC
|
#!/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. | [reply] [d/l] [select] |
|
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.
| [reply] [d/l] |
|
## process data produced by walkers
while( $Qs[ DBI_ENUM ]->dequeue ) {
...
}
| [reply] [d/l] |
|
| [reply] |
|
|