Hi Lars: What I am suggesting is:
>def serve_forever(self, poll_interval=0.5): > self._BaseServer__is_shut_down.clear() > try: > while not self._BaseServer__shutdown_request: > r, w, e = SocketServer._eintr_retry(select.select, [self], [], > [], >poll_interval) write a function that does: if stackless.getruncount() > 1: # we want to give tasklets that are ready to run a chance in case # of low I/O activity poll_interval = .5 else: poll_interval = some_other_large_value r, w, e = SocketServer._eintr_retry(select.select, [self], [], [], poll_interval) My thinking is you want to cut down on needless returns and expensive system calls. I am also assuming you don't have some timer function that depends on the polling... Cheers, Andrew On Thursday, December 12, 2013 5:15 AM, lars van Gemerden <[email protected]> wrote: what i have now (in relation to the default simpleserver use of bottle.py) is: #------------------------------------------------------------------------------------- from bottle import Bottle, ServerAdapter from wsgiref.simple_server import WSGIServer, make_server, WSGIRequestHandler import select, SocketServer class StacklessWSGIServer(WSGIServer): def serve_forever(self, poll_interval=0.5): self._BaseServer__is_shut_down.clear() try: while not self._BaseServer__shutdown_request: r, w, e = SocketServer._eintr_retry(select.select, [self], [], [], poll_interval) if self in r: self._handle_request_noblock() tasklets.schedule() finally: self._BaseServer__shutdown_request = False self._BaseServer__is_shut_down.set() class MyWSGIRefServer(ServerAdapter): server = None def run(self, handler): self.server = make_server(self.host, self.port, handler, server_class=StacklessWSGIServer, **self.options) self.server.serve_forever() def stop(self): self.server.shutdown() app = Bottle() def start_server(world_model): config = world_model.config manager = WebManager(world = world_model, secret = "jhbv235gfuhbvq2345hy3bo0") setattr(sys.modules[__name__], "manager", manager) server = MyWSGIRefServer(host=config.WS_HOST, port=config.WS_PORT) tasklets.tasklet(app.run)(server = server, debug = config.WS_DEBUG) return server #------------------------------------------------------------------------------------- I did this mainly by some reverse engineering, not by really understanding the server code. Cheers, Lars On Thu, Dec 12, 2013 at 2:07 AM, Andrew Francis <[email protected]> wrote: Hi Folks: > > >This is what I am suggesting. The reactor tasklet before calling the >underlying select/poll system call should look at the scheduler queue. If >there are runnable tasklets, then call select/poll with a timeout. Otherwise >block indefinitely. The idea is if your application is consists of mostly I/O >bound tasklets, they will be blocked on channels and will eventually be >scheduled and run when there is I/O for them. > > >I'll write a simple example to illustrate..... > > >Cheers, >Andrew > > > >On Wednesday, December 11, 2013 7:00 AM, lars van Gemerden ><[email protected]> wrote: > >Hi Andrew, > > >It wasn't blocked on IO, the server got stuck in it's mainloop (or similar >name). I don't know much about webservers, WSGIservers etc, but what i also >tried was putting a schedule() in this mainloop (which i think polls the >socket). Is this what you suggest? It seems to work well, apart from the >occasional weird AttributeError, which i'll have to look into. However others >discouraged this approach, but i never quite understood why. > > >Cheers, Lars > > > >On Fri, Dec 6, 2013 at 7:40 PM, Andrew Francis <[email protected]> wrote: > >Hi Lars: >> >> >>Message: 1 >>Date: Thu, 5 Dec 2013 22:07:20 +0100 >>From: lars van Gemerden <[email protected]> >>To: The Stackless Python Mailing List <[email protected]> >>Subject: Re: [Stackless] monkeypatching >>Message-ID: >> <cap8kt8ylp1p46dezfdbwketvwmbwfxbara+msxvixhuwxj0...@mail.gmail.com> >>Content-Type: text/plain; charset="windows-1252" >> >>>(oh, i created a tasklet for the bottle microframework run() method, which >>>includes the mainn server loop()) ; I only called schedule() on each web >>>server request to be able to do anything outside the server mainloop. >>>However that had the effect that process steps where not executed as >long as the end user sent no requests (some processes do not have any >web component). >> >> >> >>I haven't had a chance to carefully look at your code. However from this >>description, it sounds like a thread/tasklet is blocked on I/O. This will >>have the effect of blocking all tasklets in that thread. What you need to do >>is occasionally call a timeout from the underlying system call (for example, >>select()) and do a schedule() so other tasklets can run. >> >> >>Cheers, >>Andrew >> >> >>P.S - Yahoo's new and improved mail interface is killing me! >>_______________________________________________ >>Stackless mailing list >>[email protected] >>http://www.stackless.com/mailman/listinfo/stackless >> > > > >-- >==================================== >Lars van Gemerden >[email protected] >+31 6 26 88 55 39 >==================================== > > -- ==================================== Lars van Gemerden [email protected] +31 6 26 88 55 39 ====================================
_______________________________________________ Stackless mailing list [email protected] http://www.stackless.com/mailman/listinfo/stackless
