[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