<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>On Apr 22, 2015, at 11:22, Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:</div><div><br></div><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 22, 2015 at 11:12 AM, Eric Snow <span dir="ltr"><<a href="mailto:ericsnowcurrently@gmail.com" target="_blank">ericsnowcurrently@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Wed, Apr 22, 2015 at 11:46 AM, Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br>
> Hey Nathaniel, can you bring this up in the PEP 492 thread? It sounds like<br>
> it would be super great if the async with statement would (optionally?)<br>
> notify the context manager of switching to a different task and back.<br>
<br>
</span>Interesting idea.  Keep in mind that decimal.localcontext() makes use<br>
of thread-local namespaces.  So we may still be better off if we can<br>
adapt that concept to coroutines.  If I've understood correctly,<br>
Tasks.current_task() should give us what we need.  I'm just not clear<br>
on a couple things.  Where does the loop comes from?  Can more than<br>
one loop be running at the same time?  I probably need to go dig into<br>
the asyncio docs.<span class="HOEnZb"></span><br></blockquote></div><br></div><div class="gmail_extra">Usually there's only one loop, and you get it using asyncio.get_event_loop(). A loop is tied to a thread, so that function gets the current thread's loop. You could have another loop running in another thread, but it requires an explicit choice to set that up (by default you only get a loop for the main thread). </div></div></div></blockquote><div><br></div><div>If we had loop-local variables as well as thread-local, and loops are (if there's more than one) themselves thread-local, does that mean we could have a wrapper to get "local storage", which returns the loop-local storage if get_event_loop returns a loop, and thread-local storage otherwise, and change decimal contexts (and maybe other things?) to use that wrapper?</div><div><br></div><div>Or is it not as simple as that?</div><div><br></div><div>(As a side note, since the "block"/"macro" thread last month turned into a sort of proposal for dynamically-scoped variables before fizzling out: coroutine-chain-local-storage is the reason Scheme considered adding defvar, I think in R5. It might be worth looking into why they thought the feature was unnecessary; presumably it's because there's a better way to do the same thing, and that better way might make sense for Python as well?)</div><br><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra">Each loop will manages a completely distinct set of tasks (and it would require some dedication and ill will to mix up tasks between loops).<br><br></div><div class="gmail_extra">You'd probably need to either have a separate asyncio-aware context for decimal, or you'd have to add asyncio-awareness to the existing context class. Both seem reasonable options; the latter seems a bit more user-friendly since users can convert existing thread-based code to coroutines without having to worry about decimal context managers across I/O waits.<br clear="all"></div><div class="gmail_extra"><br>-- <br><div class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Python-ideas mailing list</span><br><span><a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a></span><br><span><a href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a></span><br><span>Code of Conduct: <a href="http://python.org/psf/codeofconduct/">http://python.org/psf/codeofconduct/</a></span></div></blockquote></body></html>