I recommend calling async() to convert each coroutine to a task. Then call
wait() with the tasks. You can then compare the returned task(s) directly
to the input tasks. I.e.:

    ws_task = asyncio.async(websocket.recv())
    redis_task = asyncio.async(redis_subscriber.next_published())
    done, pending = yield from asyncio.wait([ws_task, redis_task],
return_when=asyncio.FIRST_COMPLETED)
    for task in done:
        if task == ws_task:
            yield from send_to_redis(task.result())
        elif task == redis_task:
            yield from send_to_websocket(task.result())


On Tue, Nov 11, 2014 at 3:52 PM, Don Spaulding <donspauldin...@gmail.com>
wrote:

> Hi All,
>
> I'm trying to figure out The Right Way to wait on an asynchronous result
> from two different asyncio-enabled libraries.  At first glance (and my
> first implementation of a solution to my problem), it seems like I want to
> use something like the following:
>
>     # given a server that shuttles messages between a websocket and a
> redis server
>     # wait until the next message arrives, from whichever source, and send
> it to the other
>     ws_coro = websocket.recv()
>     redis_coro = redis_subscriber.next_published()
>     done, pending = yield from asyncio.wait([ws_coro, redis_coro],
> return_when=asyncio.FIRST_COMPLETED)
>     for task in done:
>         if task._coro == ws_coro:
>             yield from send_to_redis(task.result())
>         elif task._coro == redis_coro:
>             yield from send_to_websocket(task.result())
>
> Indeed, this works, except that the behavior that comes after
> asyncio.wait() seems a little suspect to me.  To differentiate between the
> returned result, I have to use the private attribute `task._coro`.  Is that
> really the intended use of asyncio.wait?  Is there something more
> appropriate to my situation?
>
> To recap, I want to wait on the first completed task of two (or more)
> heterogenous task types.  And then I want to process results from each task
> type in a distinct way.
>
> I'd gladly welcome any advice on the topic.
> --
> Don
>



-- 
--Guido van Rossum (python.org/~guido)

Reply via email to