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