Hi Richard,

Am 07.11.2013 19:19, schrieb Richard Tew:
Why can't you unpickle it again?
Well it doesn't fit well in the overall architecture of the application, because the pickle not only contains the tasklet but also a bunch of other objects I don't want to recreate. But in theory it would be possible to unpickle it again or to delay unpickling of the tasklet.

Cheers
  Anselm



  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 <[email protected]> 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 [email protected]             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
[email protected]
http://www.stackless.com/mailman/listinfo/stackless


_______________________________________________
Stackless mailing list
[email protected]
http://www.stackless.com/mailman/listinfo/stackless


--
 Dipl. Phys. Anselm Kruis                       science + computing ag
 Senior Solution Architect                      Ingolstädter Str. 22
 email [email protected]             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
[email protected]
http://www.stackless.com/mailman/listinfo/stackless

Reply via email to