[Stackless] How to "transfer" a tasklet to the current thread

Richard Tew richard.m.tew at gmail.com
Thu Nov 7 19:19:49 CET 2013


Why can't you unpickle it again?  Or presuming it hasn't been run, not
unpickle it until it runs on the chosen thread - but unpickle the
associated data to make that choice by itself?


Cheers,
Richard.

On 11/8/13, Anselm Kruis <a.kruis at science-computing.de> wrote:
> Hi,
>
> I have the following use case: the main thread unpickles a tasklet and
> some assorted data and decides, that the tasklet shall be run on a
> worker thread.
>
> Problem: as far as I know, a tasklet bound to a thread (via cstate) and
> this association can't be changed. The best we can do is to create a new
> tasklet on the worker thread, that belongs to the worker thread.
>
> Correct?
>
> No I can't simply unpickle the tasklet again. Therefore I need to move
> the state from the first tasklet to a newly created one. Currently I
> have the following method:
>
> import stackless
> import thread
> def to_current_thread(task):
>      """
>      Get a tasklet for the current thread.
>
>      If the tasklet already belongs to the current thread, this
>      method returns the tasklet unmodified.
>
>      Otherwise, this method tries to
>      unbind the tasklet and returns a newly created tasklet. If
>      unbinding fails, the method raises :exc:`RuntimeError`.
>      """
>      if task.thread_id == thread.get_ident():
>          return task
>      reducedTask = task.__reduce__()
>      # raise RuntimeError, if task is alive but not paused
>      task.bind(None)
>
>      if True:  # python will crash if set to False
>          frameList = reducedTask[2][3]
>          for i in range(len(frameList)):
>              frame = frameList[i]
>              if isinstance(frame, stackless.cframe):
>                  reducedFrame = frame.__reduce__()
>                  newFrame = reducedFrame[0](*reducedFrame[1])
>                  newFrame.__setstate__(reducedFrame[2])
>                  frameList[i] = newFrame
>      # rebind the task
>      task = reducedTask[0](*reducedTask[1])
>      task.__setstate__(reducedTask[2])
>      return task
>
> # extend the tasklet
> stackless.tasklet.to_current_thread = to_current_thread
>
>
> Is this method correct? Anything to improve?
>
> Regards
>    Anselm
>
>
> --
>   Dipl. Phys. Anselm Kruis                       science + computing ag
>   Senior Solution Architect                      Ingolstädter Str. 22
>   email A.Kruis at science-computing.de             80807 München, Germany
>   phone +49 89 356386 874  fax 737               www.science-computing.de
> --
> Vorstandsvorsitzender/Chairman of the board of management:
> Gerd-Lothar Leonhart
> Vorstand/Board of Management:
> Dr. Bernd Finkbeiner, Michael Heinrichs,
> Dr. Arno Steitz, Dr. Ingrid Zech
> Vorsitzender des Aufsichtsrats/
> Chairman of the Supervisory Board:
> Philippe Miltin
> Sitz/Registered Office: Tuebingen
> Registergericht/Registration Court: Stuttgart
> Registernummer/Commercial Register No.: HRB 382196
>
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless
>



More information about the Stackless mailing list