[Stackless] Proposal: new tasklet method set_args(*args, **kw) that combines setup() and remove()

Anselm Kruis a.kruis at science-computing.de
Fri Nov 22 23:40:37 CET 2013


Hi,

+1.

I also thought about a similar solution:
def set_args(self, function, *args, **kw):
But I didn't like the name "set_args".

Am 21.11.2013 10:54, schrieb Kristján Valur Jónsson:
> Sounds fine.
> Btw, I'd argue with a different set_args()
> I always found it weird to have separate 'bind' and 'setup'
>
> How about extending "bind" like this:
>
> def bind(self, function, args=None, keywords=None):
> The presence of args and/or keywords as being non-None, would then
> imply a setup, without scheduling it.

And in case of a setup, if function is None take the value of self 
tempval as function, similar to setup().

That's a good solution and it avoids introducing new names.


Cheers
   Anselm


>
> K
>
>> -----Original Message-----
>> From: stackless-bounces at stackless.com [mailto:stackless-
>> bounces at stackless.com] On Behalf Of Anselm Kruis
>> Sent: 19. nóvember 2013 11:16
>> To: stackless at stackless.com
>> Subject: Re: [Stackless] Proposal: new tasklet method set_args(*args, **kw)
>> that combines setup() and remove()
>>
>> Hi Kristján,
>>
>> I wasn't aware of stackless.atomic(). It's not yet documented.
>>
>> Obviously there are a few pending issues before we can release 2.7.6-slp.
>>
>> - add set_args()
>> - add run_remove()
>> - update the documentation
>> - update the changelog
>>
>> Anything else? We should really try to create a consistent and well
>> documented release.
>>
>> Cheers
>>     Anselm
>>
>>
>> Am 19.11.2013 10:16, schrieb Kristján Valur Jónsson:
>>> It does, inasmuch that the implicit "insert" that  exists on many methods is
>> indeed annoying.
>>> But it is not really a problem, because:
>>>
>>> def set_args(t, args=(), kw={}):
>>>     with stackless.atomic():
>>>       t.setup(*args, **kw):
>>>       t.remove()
>>>
>>>
>>> A more annoying problem that isn't solvable, and that is that there is no
>> run_remove(), i.e. no way switch to a tasklet and remove the caller from the
>> run queue.
>>> This is something that is needed in stacklesslib.async:
>>>
>>>
>>> def call_async(callable, args=(), kwargs={}):
>>>       awaiter = Awaiter(stackless.getcurrent())
>>>       callee = stackless.tasklet(async_call_helper)
>>>       future = futures.Future()
>>>       with atomic():
>>>           callee(future, awaiter, callable, args, kwargs)
>>>           try:
>>>               # here, a run(remove=True) or a switch() primitive would be useful
>>>               callee.run()
>>>           finally:
>>>               # need this here, in case caller gets awoken by other means, e.g.
>> exception
>>>               awaiter.caller_continued = True
>>>       return future
>>>
>>> def async_call_helper(future, awaiter, callable, args, kwargs):
>>>       # remove the caller from the runnables queue.  There is a window here
>> where other tasklets
>>>       # might run, we need perhaps a primitive to perform this task
>>>       try:
>>>           awaiter.caller.remove()
>>>
>>>
>>>
>>>> -----Original Message-----
>>>> From: stackless-bounces at stackless.com [mailto:stackless-
>>>> bounces at stackless.com] On Behalf Of Anselm Kruis
>>>> Sent: 18. nóvember 2013 10:39
>>>> To: stackless at stackless.com
>>>> Subject: [Stackless] Proposal: new tasklet method set_args(*args,
>>>> **kw) that combines setup() and remove()
>>>>
>>>> Hi,
>>>>
>>>> I propose to add a new method set_args(*args, **kw) to class tasklet,
>>>> that combines
>>>>
>>>>         stackless.setup(*args, **kw)
>>>>         stackless.remove()
>>>>
>>>> Rationale: it is currently not possible to create an alive tasklet
>>>> without scheduling it (except via unpickling or direct __setstate__).
>>>>
>>>> With the new bind_thread() method, one can think of use cases where
>>>> one thread creates tasklets and another thread executes them. No need
>>>> to insert these tasklets into the current run queue. It could even cause
>> races.
>>>>
>>>> With set_args() in place, setup() would become a simple shortcut for
>>>> set_args() followed by insert().
>>>>
>>>> Does this proposal make sense?
>>>>
>>>> regards
>>>>      Anselm
>>>>
>>>> --
>>>>     Dipl. Phys. Anselm Kruis                       science + computing ag
>>>>     Senior Solution Architect                      Ingolstädter Str. 22
>>>>     email A.Kruis at science-computing.de<mailto:A.Kruis at science-
>> computing.de>             80807 München, Germany
>>>>     phone +49 89 356386 874  fax 737               www.science-
>> computing.de<http://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<mailto:Stackless at stackless.com>
>>>> http://www.stackless.com/mailman/listinfo/stackless
>>>
>>>
>>>
>>>
>>> It does, inasmuch that the implicit "insert" that  exists on many
>>> methods is indeed annoying.
>>> But it is not really a problem, because:
>>> def set_args(t, args=(), kw={}):
>>>     with stackless.atomic():
>>>       t.setup(*args, **kw):
>>>       t.remove()
>>> A more annoying problem that isn't solvable, and that is that there is
>>> no run_remove(), i.e. no way switch to a tasklet and remove the caller
>>> from the run queue.
>>> This is something that is needed in stacklesslib.async:
>>> def call_async(callable, args=(), kwargs={}):
>>>       awaiter = Awaiter(stackless.getcurrent())
>>>       callee = stackless.tasklet(async_call_helper)
>>>       future = futures.Future()
>>>       with atomic():
>>>           callee(future, awaiter, callable, args, kwargs)
>>>           try:
>>> # here, a run(remove=True) or a switch() primitive would be useful
>>>               callee.run()
>>>           finally:
>>>               # need this here, in case caller gets awoken by other
>>> means, e.g. exception
>>>               awaiter.caller_continued = True
>>>       return future
>>> def async_call_helper(future, awaiter, callable, args, kwargs):
>>>       # remove the caller from the runnables queue.  There is a window
>>> here where other tasklets
>>>       # might run, we need perhaps a primitive to perform this task
>>>       try:
>>> awaiter.caller.remove()
>>>> -----Original Message-----
>>>> From: stackless-bounces at stackless.com [mailto:stackless-
>>>> bounces at stackless.com] On Behalf Of Anselm Kruis
>>>> Sent: 18. nóvember 2013 10:39
>>>> To: stackless at stackless.com
>>>> Subject: [Stackless] Proposal: new tasklet method set_args(*args,
>>>> **kw) that combines setup() and remove()
>>>>
>>>> Hi,
>>>>
>>>> I propose to add a new method set_args(*args, **kw) to class tasklet,
>>>> that combines
>>>>
>>>>         stackless.setup(*args, **kw)
>>>>         stackless.remove()
>>>>
>>>> Rationale: it is currently not possible to create an alive tasklet
>>>> without scheduling it (except via unpickling or direct __setstate__).
>>>>
>>>> With the new bind_thread() method, one can think of use cases where
>>>> one thread creates tasklets and another thread executes them. No need
>>>> to insert these tasklets into the current run queue. It could even cause
>> races.
>>>>
>>>> With set_args() in place, setup() would become a simple shortcut for
>>>> set_args() followed by insert().
>>>>
>>>> Does this proposal make sense?
>>>>
>>>> regards
>>>>     Anselm
>>>>
>>>> --
>>>>    Dipl. Phys. Anselm Kruis                       science + computing ag
>>>>    Senior Solution Architect                      Ingolstädter Str. 22
>>>>    emailA.Kruis at science-computing.de
>>> <mailto:A.Kruis at science-computing.de>             80807 München, Germany
>>>>    phone +49 89 356386 874  fax 737www.science-computing.de
>>>> <http://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 <mailto: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
>>
>>
>> _______________________________________________
>> 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