asyncore deficiencies
Alain Pointdexter
alainpoint at yahoo.fr
Mon Mar 29 04:43:11 EST 2004
My personal appreciation: asyncore is the most perfect combination of
hard work and incompetence i have ever seen in my life. It is so
anti-pythonic that it should get out of the standard distribution.
Just a personal opinion ...
dw-google.com at botanicus.net (David M. Wilson) wrote in message news:<99dce321.0403281816.4df96025 at posting.google.com>...
> Josiah Carlson <jcarlson at nospam.uci.edu> wrote...
>
> > I agree that there should probably be some sort of asyncore2; I have a
> > handful of boilerplate servers and clients that I use as a base any time
> > I need something. Optimally, an asyncore2 library would have simple
> > clients and servers ready to be subclassed and customized as needed.
>
> I would expect such things to be provided by modules that are
> dependant on asyncore, eg. as asynchat is. It's beyond the scope of
> what asyncore tries to do.
>
>
> > I'm curious as to why you need to use a private map. Most uses of
> > private maps I've seen haven't added any sort of meaningful
> > functionality that couldn't have been handled by the default map. Yours
> > could be an exception, but I'm still curious.
>
> I don't need a private map, however given that the other option was a
> module variable, I naturally chose to provide my own to increase any
> required future flexibility. Indeed there is little, if anything to be
> gained from using your own map, but the option was there.
>
>
> > Again, you need to use asyncore.poll.
>
> The poll function is not documented in the manual, nor do any
> docstrings suggest it is a public interface. Internally asyncore
> chooses which of poll, poll2, or poll3 to use inside loop, so calling
> these directly also bypasses some of asyncore's OS-independance
> functionality.
>
>
> > I've never used asyncore with UDP sockets, but maybe using
> > "handle_connect = handle_read" in your subclass definition could be
> > sufficient.
>
> I see this as a workaround, and as such I think the point still
> stands. :)
>
>
> > That is exactly why polling is optional. Select is available on every
> > platform, but poll is faster on platforms that support it...
>
> That is not true at all. If you are feeling investigative, quite a
> complete starting point would be <http://www.kegel.com/c10k.html>.
> There is lots of information there regarding various OS
> implementations async IO performance using poll, epoll, select, aio_*,
> etc.
>
>
> > The trick with doing this is that you end up interrupting other
> > potentially ready sockets with handling an exception. If you are
> > feeling fiesty, I believe you can use the following and get the error
> > propagated back up:
>
> > def handle_error(self):
> > raise
>
> That's a good point, but I don't have a problem restarting the poll
> after handling an exception, a) because it shouldn't happen very
> often, b) will probably mean shutting down the service rather than
> trying to continue, and c) exceptions are generally expensive special
> cases anyway.
>
> If an exception is propogating up from the dispatcher, that means the
> dispatcher's method did not handle the exception, which should mean it
> gets passed back up the stack as it does with all other code,
> eventually ending up with a traceback print if it wasn't handled.
>
> I dislike the handle_error method since it is essentially redundant in
> the face of Python's own exception handling mechanism. If a dispatcher
> wants it's own function to handle exceptions, it should wrap it's
> methods in a try block.
>
> I assume handle_error was provided to allow graceful teardown of a
> dispatcher that was erroneous, but it isn't granular enough to be
> useful for tearing down complicated objects, given an exception that
> could have been generated anywhere in a couple of screenfuls worth of
> code, and an object that could be in any state.
>
>
> > > - Decoupling from socket objects: removal of the __getitem__ magic
> > > which causes screenfuls of abuse for a simple typo at the wrong stage
> > > in execution.
> >
> > Infinite recursion in asyncore? Yikes, I've not hit that bug before.
> > Care to post some offending code?
>
> It was entirely my fault, but here is the example anyway. :)
>
> py> from asyncore import *
> py> class D(dispatcher):
> ... def __init__(self):
> ... self.foo
> ... dispatcher.__init__(self)
> ...
> py> D()
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "<stdin>", line 3, in __init__
> File "/usr/lib/python2.3/asyncore.py", line 365, in __getattr__
> return getattr(self.socket, attr)
> File "/usr/lib/python2.3/asyncore.py", line 365, in __getattr__
> return getattr(self.socket, attr)
> File "/usr/lib/python2.3/asyncore.py", line 365, in __getattr__
> return getattr(self.socket, attr)
>
>
> > One could even have a framework for registering even handlers...yikes,
> > this is starting to sound like wxPython. I don't know if that is a good
> > idea or not.
>
> NAME asyncore
> Basic infrastructure for asynchronous socket service clients and
> servers.
>
> I think that answers the question.
>
>
> Is anyone else interested in this? I have already made small
> modifications to the asyncore module to fix a few things, but nothing
> mentioned here. I could put together a proposed asyncore2 module if
> there was interest. I may do it, out of need, anyway. :)
>
>
> David.
More information about the Python-list
mailing list