Hi Kristján,

Am 08.11.2013 10:31, schrieb Kristján Valur Jónsson:


-----Original Message-----
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.

This is right.  Although actually, for picklable tasklets (tasklets without a c 
state) this
restriction Is artificial.

Adding a method to switch the thread could be a useful extension.



      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


Looks like you are doing recursive pickling of the tasklet by hand, but only 
for the cframes, not regular frames.
Why can't you just use
return pickle.loads(pickle.dumps(task))?

A simple pickle.loads(pickle.dumps(task)) creates a deep-copy of the tasklet. There are two reasons to avoid the deep-copy:
1. it is fairly expensive
2. In this particular case the set of objects to be pickled could contain objects which register themselves upon unpickling with other components of the system and I don't want that to happen a second time.

But there is really a good point in your question. In a very quick first test, I observed only cframes in the frameList. If I understand you correctly, frameList could contain regular frames too. I'll adapt my method. But not today, a customer is waiting.


We can discuss the possibility of transferring picklable tasklets between 
threads.  As long as a tasklet is soft-switchable
it really doesn't care which thread it runs on.  A "bind_to_thread() method 
could be provided...

Well, a method tasklet.bind_to_thread(thread) would be a sensible extension.

But we can also think more of thread agnostic tasklets.
We could even have a global run-queue of thread-agnostic tasklets that threads 
could access....

I'd like to understand your use case, however.  It looks as though you are 
unpickling tasklets on one thread, then a pool of worker
threads are accessing these tasklets and attempting to run them, is that right?  For that 
purpose, a worker thread needs to "claim"
the tasklet as its own.--

It is really simple. A tasklet is part of the data, that defines an instance of a particular workflow. A user continues a serialised (pickled) flow by starting an executable with appropriate parameters in a shell (Unix-shell Windows cmd). The executable unpickles the flow data during command line procession (main-thread) and decides to display a GTK-GUI for further interaction with the user. In this case the executable uses the main thread for the GUI and one secondary thread for each flow.

Cheers
  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

Reply via email to