durusmail: quixote-users: Re: Help with using medusa
Help with using medusa
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
Re: Help with using medusa
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-19
2004-06-19
2004-06-19
2004-06-19
2004-06-20
Re: Help with using medusa
Graham Fawcett
2004-06-18
Vineet Jain wrote:

> It starts and then shuts down. I put print statements before and after the:
>
> print 'starting async loop'
> asyncore.loop()
> print 'finished async loop'

[snip]

> What should I try I next. I searched on the internet and did not get much
> success on medusa.

It looks like a problem with asyncore, not particularly with Medusa.
Perhaps you might have better luck searching for "asyncore loop problems"?

Let's eliminate some possibilities...

===========

Below is the simplest possible example of a Medusa HTTP server. It will
run an HTTP server at port 8080, which will respond only with 404 responses.

Note the assert. If, for any reason, the http_server doesn't get
registered with asyncore's socket map, then asyncore.loop() will exit
automatically, just as you described. That's why the assert is there: to
test whether this is the case.

     from medusa import http_server
     import asyncore

     PORT = 8080
     server = http_server.http_server('', PORT)
     assert len(asyncore.socket_map) > 0, 'server not registered!'
     asyncore.loop()

What happens when you execute it?

===========

Here's a slightly more involved example, that includes a running
execution trace, starting just before the asyncore.loop() call:

     from medusa import http_server
     import asyncore
     import inspect
     import sys

     def trace_func(frame, event, arg):
         fn, ln, funcname, context, idx = inspect.getframeinfo(frame)
         fnln = ('%s%s:%s' % (' ' * 25, fn, ln))[-25:]
         if context is None:
             print '%s ### %s' % (fnln, event)
         else:
             for line in context:
                 print '%s >>> %s' % (fnln, line.rstrip())

         return trace_func

     PORT = 8080
     server = http_server.http_server('', PORT)
     sys.settrace(trace_func)
     asyncore.loop()


When I run this, I get output like this:

hon23\lib\asyncore.py:180 >>> def loop(timeout=30.0, use_poll=0, map=None):
hon23\lib\asyncore.py:181 >>>     if map is None:
hon23\lib\asyncore.py:182 >>>         map = socket_map
hon23\lib\asyncore.py:184 >>>     if use_poll:
hon23\lib\asyncore.py:190 >>>         poll_fun = poll
hon23\lib\asyncore.py:192 >>>     while map:
hon23\lib\asyncore.py:193 >>>         poll_fun(timeout, map)
thon23\lib\asyncore.py:94 >>> def poll(timeout=0.0, map=None):
thon23\lib\asyncore.py:95 >>>     if map is None:
thon23\lib\asyncore.py:97 >>>     if map:
thon23\lib\asyncore.py:98 >>>         r = []; w = []; e = []
thon23\lib\asyncore.py:99 >>>         for fd, obj in map.items():
hon23\lib\asyncore.py:100 >>>             if obj.readable():
medusa\http_server.py:603 >>>     def readable (self):
medusa\http_server.py:604 >>>         return self.accepting
medusa\http_server.py:604 >>>         return self.accepting
hon23\lib\asyncore.py:101 >>>                 r.append(fd)
hon23\lib\asyncore.py:102 >>>             if obj.writable():
medusa\http_server.py:597 >>>     def writable (self):
medusa\http_server.py:598 >>>         return 0
medusa\http_server.py:598 >>>         return 0
thon23\lib\asyncore.py:99 >>>         for fd, obj in map.items():
hon23\lib\asyncore.py:104 >>>         if [] == r == w == e:
hon23\lib\asyncore.py:107 >>>             try:
hon23\lib\asyncore.py:108 >>>                 r, w, e = select.select(r,
w, e, timeout)


And then it pauses, since the select.select() call is waiting for an
incoming request.

What do you get when you try this second example?

-- Graham


reply