http://www.perlmonks.org?node_id=928929


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

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.

Replies are listed 'Best First'.
Re^4: threads and their alternatives
by Corion (Patriarch) on Sep 30, 2011 at 21:51 UTC

    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.

        My reply was more in regard to your statement that "there exists no solution" for calling blocking APIs (outside of threads), where I wanted to highlight that there exists no good solution (outside of threads).