[Python-ideas] async/await in Python (C API ?)
M.-A. Lemburg
mal at egenix.com
Mon Apr 20 18:15:12 CEST 2015
On 20.04.2015 17:17, Yury Selivanov wrote:
>
> On 2015-04-20 10:49 AM, M.-A. Lemburg wrote:
>> On 20.04.2015 15:40, Yury Selivanov wrote:
>>> Hi Marc-Andre,
>>>
>>> On 2015-04-20 9:18 AM, M.-A. Lemburg wrote:
>>>> Hi Yury,
>>>>
>>>> do you have any plans of also exposing an easy to use C API
>>>> for async and await ?
>>>>
>>>> I think this would be useful to e.g. implement asynchronous
>>>> database access. Most of those adapters are written in C and
>>>> need so a C API would help a lot with this.
>>> I think one way to have a convenient C API is to implement
>>> a Future-like object in C -- an object with __await__ method
>>> that should return an iterator, which should also be
>>> implemented in C and provide a way to attach callback
>>> or to *pipeline* C functions.
>>>
>>> This way C code should seamlessly integrate with asyncio.
>>>
>>> I doubt that we have time to include this kind of API in
>>> the PEP, but it can be developed as a separate library.
>>>
>>> Your thoughts?
>> I'm just sketching here, since I don't have much experience
>> with writing async code (I'm using threads and multiple
>> processes instead) and it probably shows ;-)
>>
>> From the C side of things, I think using callbacks
>> and a way to register/unregister polling functions
>> would be great to have.
>>
>> The C code could then run like this in polling mode:
>>
>> long_running_query(...) {
>> /* Start long running operation... creating a handle for it */
>> PyAsync_RegisterPoll(mypolling_fct, handle, polling_interval);
>> PyAsync_ReturnAwait();
>> }
>>
>> mypolling_fct(int handle) {
>> /* Check completion of operation */
>> if (completed) {
>> /* Fetch results into value */
>> PyAsync_UnregisterPoll(mypolling_fct, handle);
>> PyAsync_ReturnReady(value);
>> }
>> else
>> PyAsync_ReturnContinue();
>> }
>>
>> and like this in callback mode:
>>
>> long_running_query(...) {
>> /* Create a handle for a long running operation... */
>> PyAsync_RegisterCallback(myquery_done, handle, timeout);
>> /* Start long running operation... */
>> PyAsync_ReturnAwait();
>> }
>>
>> myquery_done(int handle, PyObject *value) {
>> PyAsync_UnregisterCallback(myquery_done, handle);
>> PyAsync_ReturnReady(value);
>> }
>>
>> Both mechanisms will likely have to move the long running
>> operation into a separate (blocking) thread, unless there's also
>> a way to register an event loop selector somewhere and the C lib
>> your interfacing to provides this mechanism as well.
>>
>
> I see what you want to do and why now.
>
> However, I can't imagine how this could be implemented
> without asyncio event loop being implemented in C.
> Coroutines from PEP 492 aren't an indepenedant concept,
> they require a library/framework with an event loop
> to make them work.
>
> The only way to go right now is to get 'get_event_loop()'
> and 'loop.call_soon()' working in C using Python C API.
>
> From that point you can implement Future object in C,
> see 'asyncio/futures.py'; Future._schedule_callbacks,
> Future.set_result and Future.__iter__ methods in
> particular.
>
> With all that, you can easily return your future object
> from C methods and everything should work just fine.
>
> I know this isn't ideal, and we actually should start a
> separate discussion on how we can improve things on
> our asyncio C side.
I'm not expecting this to be ready anytime soon,
just wanted to bring this up, since it may be something
that has to be considered in the async/await API design
early rather than later to not make it too complex to
add later on.
I'm not sure, but going through the Python API from C
can potentially result in the code to reenter which sounds
like it could cause some unwanted race conditions. A C API
would avoid this.
Thanks,
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Apr 20 2015)
>>> Python Projects, Coaching and Consulting ... http://www.egenix.com/
>>> mxODBC Plone/Zope Database Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
::::: Try our mxODBC.Connect Python Database Interface for free ! ::::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
http://www.egenix.com/company/contact/
More information about the Python-ideas
mailing list