LWP(3pm)

NAME

Coro::LWP - make LWP non-blocking - as much as possible

SYNOPSIS

use Coro::LWP; # afterwards LWP should not block

DESCRIPTION

This module is an AnyEvent user, you need to make sure that you use and run a supported event loop.

This module tries to make LWP non-blocking with respect to other
coroutines as much as possible, and with whatever means it takes.

LWP really tries very hard to be blocking (and relies on a lot of
undocumented functionality in IO::Socket), so this module had to be
very invasive and must be loaded very early to take the proper effect.

Note that the module AnyEvent::HTTP might offer an alternative to the
full LWP that is designed to be non-blocking.

Here is what it currently does (future versions of LWP might require
different tricks):

It loads Coro::Select, overwriting the perl "select" builtin globally.
This is necessary because LWP calls select quite often for timeouts and who-knows-what.
Impact: everybody else uses this (slower) version of select, too.
It should be quite compatible to perls builtin select, though.
It overwrites Socket::inet_aton with Coro::Util::inet_aton.
This is necessary because LWP might (and does) try to resolve
hostnames this way.
Impact: some code might not expect coroutine semantics, for
example, when you fork you might prefer the blocking variant
because other coroutines shouldn't actually run.
It replaces the base class of Net::HTTP, Net::FTP, Net::NNTP.
This is necessary because LWP does not always use select to see
whether a filehandle can be read/written without blocking, so the
base class "IO::Socket::INET" needs to be replaced by
"Coro::Socket".
Impact: Coro::Socket is not at all compatible to IO::Socket::INET. While it duplicates some undocumented functionality required by
LWP, it does not have all the methods of IO::Socket::INET and might act quite differently in practise. Also, protocols other than the
above mentioned will still block, at least some of the time.
All this likely makes other libraries than just LWP not block, but
thats just a side effect you cannot rely on.
Increases parallelism is not supported by all libraries, some might
cache data globally.

AUTHOR

Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout