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