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

Anselm Kruis a.kruis at science-computing.de
Mon Nov 11 09:39:49 CET 2013


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 <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
>>
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless
>

-- 
  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




More information about the Stackless mailing list