[Stackless] monkeypatching

lars van Gemerden lars at rational-it.com
Mon Dec 2 02:26:06 CET 2013


thank you for the help,

With the fix it works now; i have one problem left, is that when i start
the server from the gui, the server runs, but the (Qt/PySide) gui becomes
unresponsive. Before, i started the web app and server in a separate thread
(and had the scheduler run in that), but that probably  wont work if
threads are replaced with tasklets (if i understood the monkeypatching
somewhat).

Does anyone have any ideas how to solve that (to keep the gui responsive,
also to be able to stop the server)?  Before i tried multiprocessing, but
that led to a lot of servers running :-)

In another experiment I have overridden the server loop serve_forever() to
call stackless.schedule() (or rather tasklets.schedule() in the code
above). This seems to work apart from an occasional crash (weird attribute
error for (my subclass of) WSGIServer).

Also thanks a lot for putting up the 2.7.5 64 bit binaries!! It finally let
me run the demo on my Windows 8 laptop (no idea why, something to do with
PySide 32bit and win8 probably)

Cheers, Lars



On Mon, Dec 2, 2013 at 12:36 AM, Kristján Valur Jónsson <
kristjan at ccpgames.com> wrote:

>  A bug!
>
> in threadpool.py, replace the final line with:
>
>
>
> return tasklet_call(wrapped, dispatcher=dispatcher, timeout=timeout,
> onOrphaned=onOrphaned)
>
> Needs more unittests :)
>
>
>
> K
>  ------------------------------
> *From:* stackless-bounces at stackless.com [stackless-bounces at stackless.com]
> on behalf of lars van Gemerden [lars at rational-it.com]
> *Sent:* Sunday, December 01, 2013 1:58 PM
> *To:* The Stackless Python Mailing List
> *Subject:* Re: [Stackless] monkeypatching
>
>   OK, thanks for the input,
>
>  i am trying to get this to work, but i might have found a bug (which i
> find hard to debug):
>
>  i have reimplemented the code above as:
> --------------------------------------------------------------
>  import asyncore, traceback, sys, logging
>
>  import stacklesslib.main
> import stacklesslib.app
>
>  # the unittests use time.time() for various time tests.
> # Therefore, we must make sure that main uses this
> from time import time as elapsed_time
> stacklesslib.main.elapsed_time = elapsed_time
>
>  class MonkeyTasklets(object):
>
>     _stop = False
>
>     stacklesslib.app.install_stackless()
>
>     @classmethod
>     def run(cls, world, webserver = None, maxcount = None): #param killer
> is ignored
>         world.flowmodel.start()
>         if webserver:
>             cls.server = webserver.start_server(world_model = world)
> #starts a tasklet for running the webserver
>         counter = 0
>         while not cls._stop or counter > maxcount:
>             counter += 1
>             tick_time = elapsed_time()
>             try:
>                 stacklesslib.main.mainloop.loop()
>             except Exception as e:
>                 import asyncore
>                 if isinstance(e, ReferenceError):
>                     print("run:EXCEPTION", str(e), asyncore.socket_map)
>                 else:
>                     print("run:EXCEPTION", asyncore.socket_map)
>                     traceback.print_exc()
>                 sys.exc_clear()
>         world.flowmodel.stop()
>
>     @classmethod
>     def schedule(cls):
>         stackless.schedule()
>
>     @classmethod
>     def tasklet(cls, func):
>         return stackless.tasklet(func)
>
>     @classmethod
>     def stop(cls):
>         if hasattr(cls, "server"):
>             cls.server.stop()
>         cls._stop = True
>
>
>  tasklets = MonkeyTasklets
>
>  --------------------------------------------------------------
>   and i get the exception:
>
>  File "d:\Documents\Code\python\floware\server\bottle.py", line 641, in
> run
>   run(self, **kwargs)
> File "d:\Documents\Code\python\floware\server\bottle.py", line 2720, in
> run
>   server.run(app)
> File "d:\Documents\Code\python\floware\server\webserver.py", line 329, in
> run
>   self.server.serve_forever()
> File "C:\Python27\lib\SocketServer.py", line 236, in serve_forever
>   poll_interval)
> File "C:\Python27\lib\SocketServer.py", line 155, in _eintr_retry
>   return func(*args)
> File
> "d:\Documents\Code\python\floware\stacklesslib\replacements\select.py",
> line 27, in select
>   return stacklesslib.threadpool.call_on_thread(real_select.select, args,
> kwargs)
> File "d:\Documents\Code\python\floware\stacklesslib\threadpool.py", line
> 123, in call_on_thread
>   return tasklet_call(wrapped, dispatcher, timeout=timeout,
> onOrphaned=onOrphaned)
> File "d:\Documents\Code\python\floware\stacklesslib\util.py", line 209,
> in tasklet_call
>   return channel_wait(chan, timeout)
> File "d:\Documents\Code\python\floware\stacklesslib\util.py", line 53, in
> channel_wait
>   return chan.receive()
> File "d:\Documents\Code\python\floware\stacklesslib\util.py", line 192,
> in helper
>   result = function(*args, **kwargs)
>
> TypeError: wrapped() argument after * must be a sequence, not function
> --------------------------------------------------------------
>  is this something i am doing wrong or indeed a buggy in stacklesslib and
> if so, how can it be fixed?
>
>  Cheers, Lars
>
>
> On Sun, Dec 1, 2013 at 4:05 AM, Richard Tew <richard.m.tew at gmail.com>wrote:
>
>> latest stacklesslib, i mean.
>>
>> On 12/1/13, Richard Tew <richard.m.tew at gmail.com> wrote:
>> > Hi Lars,
>> >
>> > stacklessio is internal ccp stuff.
>> >
>> > main.py in stacklesslib is pretty much all you need to understand,
>> > beyond calling patch_all().  It is a scheduler, and makes your Open
>> > scheduler redundant.
>> >
>> > I suggest you get the latest stacklessio from:
>> >
>> > https://bitbucket.org/krisvale/stacklesslib
>> >
>> > And then you check out test / teststdlibunittests.py, which is a short
>> > example of monkey patching and running the stacklesslib scheduler.
>> >
>> > Cheers,
>> > Richard.
>> >
>> > On 12/1/13, lars van Gemerden <lars at rational-it.com> wrote:
>> >> sorry,
>> >>
>> >> patch_all seemed to simple, question was a bit rethoric ;-) tried it 2
>> >> mins
>> >> after pressing send just in case and indeed no cigar.
>> >>
>> >> I am trying to get this demo running and all kinds of last minute ####
>> is
>> >> popping up.
>> >>
>> >> I tried reading the source but it doesn't click; i am not familiar with
>> >> using sockets etc. at all.
>> >>
>> >> e.g.
>> >>
>> >> - do i need 'stacklessio'?
>> >> - can i (essentially) just put a stackless.schedule() (or
>> >> OpenTasklets.schedule() in the code below) in the serve_forever loop?
>> >> - will this work at all with an adapted scheduler like this:
>> >>
>> >> class OpenTasklets(object):
>> >>
>> >>     _stop = False
>> >>
>> >>     @classmethod
>> >>     def run(cls, maxcount = None):
>> >>         cls.schedule_channel = stackless.channel()
>> >>         cls.schedule_channel.preference = 1
>> >>         counter = 0
>> >>         OpenTasklets._stop = False
>> >>         while stackless.getruncount() != 1:
>> >>             stackless.run()
>> >>             cls.reschedule(cls._stop or (maxcount and counter >
>> >> maxcount))
>> >>             counter += 1
>> >>
>> >>     @classmethod
>> >>     def schedule(cls):
>> >>         if cls.schedule_channel.receive():
>> >>             raise TaskletExit
>> >>
>> >>     @classmethod
>> >>     def reschedule(cls, stop = False):
>> >>         while cls.schedule_channel.balance < 0:
>> >>             cls.schedule_channel.send(stop)
>> >>
>> >> Any help is appreciated ..
>> >>
>> >> Lars
>> >>
>> >>
>> >>
>> >>
>> >> On Sat, Nov 30, 2013 at 8:53 PM, Richard Tew
>> >> <richard.m.tew at gmail.com>wrote:
>> >>
>> >>> Lars :-)
>> >>>
>> >>> Yes, there is no documentation for stacklesslib yet.  To use it, you
>> >>> really need to be willing to read the source code.
>> >>>
>> >>> You should already know whether calling patch_all would be enough.  It
>> >>> would have been something you could have tried immediately, rather
>> >>> than asking the list and waiting.
>> >>>
>> >>> Cheers,
>> >>> Richard.
>> >>>
>> >>> On 11/30/13, lars van Gemerden <lars at rational-it.com> wrote:
>> >>> > Hi all,
>> >>> >
>> >>> > I though i could avoid it to run my demo but it seems i need to let
>> >>> > the
>> >>> > webserver (simple server?, single thread, 'bottle' micro framework)
>> >>> > yield
>> >>> > to the scheduler i am using. I have downloaded stacklesslib 1.0.3,
>> but
>> >>> > can't find any documentation to help with monkeypatching.
>> >>> >
>> >>> > - Do i just run patch_all at the start of the program?
>> >>> >
>> >>> > Any help is very welcome ..
>> >>> >
>> >>> > Cheers, Lars
>> >>> >
>> >>> > --
>> >>> > ====================================
>> >>> > Lars van Gemerden
>> >>> > lars at rational-it.com
>> >>> > +31 6 26 88 55 39
>> >>> > ====================================
>> >>> >
>> >>>
>> >>> _______________________________________________
>> >>> Stackless mailing list
>> >>> Stackless at stackless.com
>> >>> http://www.stackless.com/mailman/listinfo/stackless
>> >>>
>> >>
>> >>
>> >>
>> >> --
>> >> ====================================
>> >> Lars van Gemerden
>> >> lars at rational-it.com
>> >> +31 6 26 88 55 39
>> >> ====================================
>> >>
>> >
>>
>> _______________________________________________
>> Stackless mailing list
>> Stackless at stackless.com
>> http://www.stackless.com/mailman/listinfo/stackless
>>
>
>
>
>  --
> ====================================
> Lars van Gemerden
> lars at rational-it.com
> +31 6 26 88 55 39 <#142b0afb3d212348_>
> ====================================
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless
>



-- 
====================================
Lars van Gemerden
lars at rational-it.com
+31 6 26 88 55 39
====================================
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.stackless.com/pipermail/stackless/attachments/20131202/5e13e3db/attachment-0001.html>


More information about the Stackless mailing list