[openstack-dev] Asynchrounous programming: replace eventlet with asyncio

Zane Bitter zbitter at redhat.com
Fri Feb 7 03:32:26 UTC 2014


On 06/02/14 13:22, Joshua Harlow wrote:
> Has there been any investigation into heat.
>
> Heat has already used parts of the coroutine approach (for better or
> worse).
>
> An example:
> https://github.com/openstack/heat/blob/master/heat/engine/scheduler.py#L230
>
> """
>      Decorator for a task that needs to drive a subtask.
>
>      This is essentially a replacement for the Python 3-only "yield from"
>      keyword (PEP 380), using the "yield" keyword that is supported in
>      Python 2. For example::
> """....

I heard my name :)

For those not familiar, here is what we're doing in Heat: we use both 
eventlet and co-routines. We use eventlet pretty conventionally - it 
allows us to run multiple user requests on the same engine concurrently, 
so that when one is blocked on I/O, the others run. We also use 
co-routines to organise our workflow within a single user request, so 
that we don't sit in a tight loop polling for resources to finish being 
created, but instead move on with any other non-dependent resources 
before coming back to poll again.

There are actually some advantages to keeping these mechanisms separate 
- it's pretty clear which operations are atomic (within the context of a 
single request), and this is orthogonal to when you do I/O. I'm not sure 
if Futures would have the same property?

The docstring quoted above is from the taskwrapper decorator, which 
effectively makes any 'yield's in the wrapped co-routine act like 'yield 
from' in Python 3. I always describe 'yield from' as like a function 
call but for coroutines... however, anecdotally I can confirm that 
people still find this very confusing. Maybe in 5-10 years when there 
are a lot of asyncio programs floating around this will make more sense.

[BTW am I right in thinking that in trollius you _have_ to drive your 
co-routines from a top-level Task? That's not the case in Heat (although 
we do anyway), or IIUC in asyncio - I was expecting e.g. the exception 
handling for Return to happen in the coroutine decorator rather than in 
Task. Just curious.]

Porting the existing co-routines part of Heat over to trollius ought to 
be fairly easy - I discovered Tulip just as I was finishing the 
implementation and it looked like what we have is pretty similar to a 
subset of it. I'm not sure this would be especially useful though. 
Long-term, I'm more interested in Josh's taskflow stuff allowing us to 
distribute the workflow across multiple engines (though we have bigger 
architectural fish to fry before we can do that).

Substantially all of our blocking I/O consists of:
1) Database calls; and
2) Calls to the OpenStack Python client libraries

So the first step in implementing trollius in Heat would probably be to 
make trollius versions of the client libraries. I'm not sure that's the 
Right Thing for clients in general though, which suggests to me that 
Heat might not be the best place to start this migration; you may not be 
able to get there from here.

The main reason asyncio exists (as opposed to, say, twisted) is that 
it's supposed to be the standard place to get an event loop from, so 
that everybody ends up using the same event loop. Right now, though, 
there are still lots of competing event loops (including eventlet) and 
it's difficult to see how introducing another one helps in the short 
term. That makes Josh's idea of porting eventlet to sit on top of 
asyncio sound less terrible than it did at first sight ;) even though it 
doesn't address any of the fundamental issues with eventlet.

cheers,
Zane.

> I bet trollius would somewhat easily replace a big piece of that code.
>
> -Josh
>
> -----Original Message-----
> From: victor stinner <victor.stinner at enovance.com>
> Reply-To: "OpenStack Development Mailing List (not for usage questions)"
> <openstack-dev at lists.openstack.org>
> Date: Thursday, February 6, 2014 at 1:55 AM
> To: "OpenStack Development Mailing List (not for usage questions)"
> <openstack-dev at lists.openstack.org>
> Subject: Re: [openstack-dev] Asynchrounous programming: replace eventlet
> with asyncio
>
>> Sean Dague wrote:
>>> First, very cool!
>>
>> Thanks.
>>
>>> This is very promising work. It might be really interesting to figure
>>> out if there was a smaller project inside of OpenStack that could be
>>> test ported over to this (even as a stackforge project), and something
>>> we could run in the gate.
>>
>> Oslo Messaging is a small project, but it's more a library. For a full
>> daemon, my colleague Mehdi Abaakouk has a proof-on-concept for Ceilometer
>> replacing eventlet with asyncio. Mehdi told me that he doesn't like to
>> debug eventlet race conditions :-)
>>
>>> Our experience is the OpenStack CI system catches bugs in libraries and
>>> underlying components that no one else catches, and definitely getting
>>> something running workloads hard on this might be helpful in maturing
>>> Trollius. Basically coevolve it with a piece of OpenStack to know that
>>> it can actually work on OpenStack and be a viable path forward.
>>
>> Replacing eventlet with asyncio is a huge change. I don't want to force
>> users to use it right now, nor to do the change in one huge commit. The
>> change will be done step by step, and when possible, optional. For
>> example, in Olso Messaging, you can choose the executor: eventlet or
>> blocking (and I want to add asyncio).
>>
>> Victor
>>
>> _______________________________________________
>> OpenStack-dev mailing list
>> OpenStack-dev at lists.openstack.org
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>




More information about the OpenStack-dev mailing list