I'm probably a bit dense today, but without browsing the code I'm not entirely sure how your thing works. What type of thing is the single-dispatch dispatching on? How would the asyncio and Tornado versions cooperate?
Perhaps you can submit a patch for asyncio to clarify the proposal? On Sun, Jan 25, 2015 at 9:42 AM, Ben Darnell <[email protected]> wrote: > In Tornado 4.1 [1], I've added a functools.singledispatch-based registry > for objects that can be yielded in coroutines. This allows for Future-like > objects from different frameworks to be mixed seamlessly in the same > coroutine (We currently have support for tornado.concurrent.Future, > concurrent.futures.Future, asyncio.Future[2], and > twisted.internet.defer.Deferred) > > I'd like to suggest that asyncio add something similar to facilitate the > use of libraries from different frameworks in the same coroutine, not just > sharing the same event loop. It would be a pretty simple change: just call > a function decorated with @singledispatch (whose default implementation is > the identity function) before handling the result in Task._step. > > I've included a simple example of a hybrid tornado/asyncio coroutine > below. > > -Ben > > [1] Currently in beta, installable with `pip install > https://github.com/tornadoweb/tornado/archive/v4.1.0b1.zip` > <https://github.com/tornadoweb/tornado/archive/v4.1.0b1.zip> > [2] The future objects are all similar enough that they don't really need > this level of abstraction, but they serve as a proof of concept. > > # requirements: > # python3.4 (for 3.3, add asyncio and singledispatch) > # aiohttp > # https://github.com/tornadoweb/tornado/archive/v4.1.0b1.zip > import aiohttp > import asyncio > import tornado.gen > import tornado.httpclient > import tornado.ioloop > import tornado.platform.asyncio > > @tornado.gen.coroutine > def main(): > t_client = tornado.httpclient.AsyncHTTPClient() > t_response = yield t_client.fetch('http://www.google.com') > print('tornado: read %d bytes with status code %d' % > (len(t_response.body), t_response.code)) > > a_response = yield from aiohttp.request('GET', 'http://www.google.com > ') > a_body = yield from a_response.read() > print('aiohttp: read %d bytes with status code %d' % > (len(a_body), a_response.status)) > > # Alternate python2-compatible syntax > a_response2 = yield asyncio.async(aiohttp.request('GET', ' > http://www.google.com')) > a_body2 = yield asyncio.async(a_response2.read()) > print('aiohttp2: read %d bytes with status code %d' % > (len(a_body2), a_response2.status)) > > if __name__ == '__main__': > > tornado.ioloop.IOLoop.configure(tornado.platform.asyncio.AsyncIOMainLoop) > tornado.ioloop.IOLoop.current().run_sync(main) > > -- --Guido van Rossum (python.org/~guido)
