Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re^2: threads and their alternatives

by Corion (Patriarch)
on Sep 30, 2011 at 20:23 UTC ( [id://928907]=note: print w/replies, xml ) Need Help??


in reply to Re: threads and their alternatives
in thread Alternatives to threads for maintaining GUI app responsiveness

As an aside, AnyEvent is fairly portable and has a solution to blocking APIs like DBI. Whether that solution is really a good solution stands to debate - it spawns an external process which executes the fetch and then passes the results back via IPC. In principle, this idea isn't all bad, except that I wouldn't use one external process per query but a separate thread that does all database interaction.

Replies are listed 'Best First'.
Re^3: threads and their alternatives
by BrowserUk (Patriarch) on Sep 30, 2011 at 21:42 UTC
    AnyEvent is fairly portable

    Really? Does it work with files and pipes under Windows?

    Does AnyEvent::DBI work on Windows? Cos you certainly wouldn't think so looking at the source:

    my $pid = fork; if ($pid) { # parent close $server; } elsif (defined $pid) { # child my $serv_fno = fileno $server; if ($self->{exec_server}) { fcntl $server, &Fcntl::F_SETFD, 0; # don't close the server s +ide exec {$^X} "$0 dbi slave", -e => "require shift; AnyEvent::DBI::serve_fd ($serv_fno +, $VERSION)", $INC{"AnyEvent/DBI.pm"}; POSIX::_exit 124; } else { ($_ != $serv_fno) && POSIX::close $_ for $^F+1..$FD_MAX; serve_fh $server, $VERSION; # no other way on the broken windows platform, even this leak +s # memory and might fail. kill 9, $$ if AnyEvent::WIN32; # and this kills the parent process on windows POSIX::_exit 0; } } else { croak "fork: $!"; } $self->{child_pid} = $pid; $self->_req ( ($self->{on_connect} ? $self->{on_connect} : sub { }), (caller)[1,2], req_open => $dbi, $user, $pass, %dbi_args ); $self }
    has a solution to blocking APIs like DBI. ... it spawns an external process which executes the fetch and then passes the results back via IPC.

    I guess I could have said "don't have a good solution", but I don't consider starting a new process for each query and then having to squeeze potentially large amounts of structured data through a byte stream, a solution worthy of the name.


    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".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      So far, I've only used AnyEvent for TCP and timers, and that works well on Windows. I suppose it works well enough with pipes, at least it has lots of Win32-specific code to create a selectable pipe on Win32. I haven't used AnyEvent::DBI, as I'd use a thread instead of an external process if I had the need to do asynchronous DB access on Windows, and the code looks as if it uses features like selectable filehandles, that just aren't conveniently available on Windows...

        I haven't used AnyEvent::DBI, as I'd use a thread instead of an external process

        Then what would be the point of AnyEvent for the OPs problem?


        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".
        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://928907]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (4)
As of 2024-04-25 07:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found