Thank you for your comment, Shlomi.

> 1. There's no such thing as IOScalar. Maybe you mean writing to an in-memory
> buffer.

Yes, in-memory buffer. That's what I meant.

> 2. Don't use threads in Perl. They cause too many problems.

Is there any workaround? to make multi-thread script without 'use threads'?

> 4. Please add "use warning;" to your code and correct all warnings.

There were warnings with the sample script I attached but I couldn't
correct it :-(
So I changed the idea, using in-memory buffer inside child sub-routine and take 
result as return value.
This worked.
<<<
#!perl
use strict;
use warnings;
use threads ('yield',
             'stack_size' => 64*4096,
             'exit' => 'threads_only',
             'stringify');

my @result;
my @thr;
for (my $i = 0; $i < 10; $i++) {
    $thr[$i] = threads->create(
        sub{my $i = shift; my $buf;
            open my $fh, ">:scalar", \$buf;
            print $fh "test$i";
            close $fh;
            return \$buf;
            },
        $i);
}
for (@thr) {push @result, $_->join();}
for (@result) {
    print $$_, "\n";
}

Thanks again.


On Tue, 23 Mar 2010 15:12:02 +0200
Shlomi Fish <shlo...@iglu.org.il> wrote:

> Hi iizuka!
> 
> On Tuesday 23 Mar 2010 09:53:54 iiz...@sizk.net wrote:
> > I'm trying to make threaded Net::Telnet program.
> > I want all "input_log" to be written to one file.
> > So I tried to give an IOScalar FileHandle to "input_log", then output real
> > file later. IOScalar works fine, threads works fine.
> > But together dosen't work.
> > Here is sample script.
> > Any suggestions appreciated.
> > 
> 
> A few notes:
> 
> 1. There's no such thing as IOScalar. Maybe you mean writing to an in-memory 
> buffer.
> 
> 2. Don't use threads in Perl. They cause too many problems.
> 
> 3. Don't use the FileHandle module. It is deprecated. Look at lexical 
> filehandles and IO::Handle instead.
> 
> 4. Please add "use warning;" to your code and correct all warnings.
> 
> Regards,
>       
>       Shlomi Fish
> 
> > # works fine without threads
> > use strict;
> > use FileHandle;
> > 
> > my @result;
> > for (my $i = 0; $i < 10; $i++) {
> >     my $fh = new FileHandle \($result[$i]), '>:scalar';
> >     $fh->print("test$i");
> >     $fh->close();
> > }
> > for (@result) {
> >     print $_, "\n";
> > }
> > -----
> > # no output with threads
> > use strict;
> > use FileHandle;
> > use threads ('yield',
> >              'stack_size' => 64*4096,
> >              'exit' => 'threads_only',
> >              'stringify');
> > 
> > my @result;
> > my @thr;
> > for (my $i = 0; $i < 10; $i++) {
> >     my $fh = new FileHandle \($result[$i]), '>:scalar';
> >     $thr[$i] = threads->create(sub{$_[0]->print($_[1]);$_[0]->close()},
> >                                $fh,
> >                                "test$i");
> > }
> > for (@thr) {my $dummy = $_->join();}
> > for (@result) {
> >     print $_, "\n";
> > }
> 
> -- 
> -----------------------------------------------------------------
> Shlomi Fish       http://www.shlomifish.org/
> Why I Love Perl - http://shlom.in/joy-of-perl
> 
> Deletionists delete Wikipedia articles that they consider lame.
> Chuck Norris deletes deletionists whom he considers lame.
> 
> Please reply to list if it's a mailing list post - http://shlom.in/reply .

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to