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/