> Reading about asyncio in uwsgi at > http://uwsgi-docs.readthedocs.org/en/latest/asyncio.html > > I really didn't like the ugly explicit switching, passing the greenlet > around and the future. So I made this simple decorator that hides that > away: > > def coroutine(f): > > def _f(*args, **kwargs): > myself = greenlet.getcurrent() > co = asyncio.coroutine(f) > future = asyncio.async(co(*args, **kwargs)) > > future.add_done_callback(lambda _: myself.switch()) # goes back > to the suspended call, one line below > myself.parent.switch() # suspends. > goes to the event loop > > return future.result() > > return _f > > So it takes the wrapped function, wraps it in a asyncio.coroutine, > sets it for running as a Task (which returns a future), registers a > callback on the future to switch back the greenlet, and switches away > the greenlet. When the greenlet gets switched back to, it gets the > result of the future and returns that. > > @coroutine wrapped functions still need to use 'yield from' of course, > since they are still asyncio coroutines. > > Usage is like this: > > @coroutine > def sleeping(): > yield from asyncio.sleep(2) > return b'test' > > def application(environ, start_response): > start_response('200 OK', [('Content-Type','text/html')]) > response = sleeping() > return [response] > > > -- > damjan > _______________________________________________ > uWSGI mailing list > [email protected] > http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi >
Well, cool, i suppose the second approach could be automatically enabled by the plugin itself, allowing asyncio apps to be transparently executed on uwsgi. I did not have tried your code yet (still coming back from fosdem), i'll back to you asap -- Roberto De Ioris http://unbit.com _______________________________________________ uWSGI mailing list [email protected] http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi
