This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author djarb
Recipients djarb, gvanrossum, vstinner, yselivanov
Date 2014-08-20.18:03:50
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1408557830.66.0.604610139339.issue22239@psf.upfronthosting.co.za>
In-reply-to
Content
It's occasionally necessary to invoke the asyncio event loop from code that was itself invoked within (although usually not directly by) the event loop.

For example, imagine you are writing a class that serves as a local proxy for a remote data structure. You can not make the __contains__ method of that class into a coroutine, because Python automatically converts the return value into a boolean. However, __contains__ must invoke coroutines in order to communicate over the network, and it must be invokable from within a coroutine to be at all useful.

If the event loop _run_once method were reentrant, addressing this problem would be simple. That primitive could be used to create a loop_until_complete function, which could be applied to the io tasks that __contains__ needs to invoke

So, making _run_once reentrant is one way of addressing this request.

Alternately, I've attached a decorator that sets aside some of the state of _run_once, runs a couroutine to completion in a nested event loop, restores the saved state, and returns the coroutine's result. This is merely a proof of concept, but it does work, at least in my experiments.
History
Date User Action Args
2014-08-20 18:03:50djarbsetrecipients: + djarb, gvanrossum, vstinner, yselivanov
2014-08-20 18:03:50djarbsetmessageid: <1408557830.66.0.604610139339.issue22239@psf.upfronthosting.co.za>
2014-08-20 18:03:50djarblinkissue22239 messages
2014-08-20 18:03:50djarbcreate