New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add __main__
module with await
-compatible console
#2407
Open
wbadart
wants to merge
15
commits into
python-trio:master
Choose a base branch
from
wbadart:master
base: master
Could not load branches
Branch not found: {{ refName }}
Could not load tags
Nothing to show
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
I recently learned that `python -m asyncio` drops you into an interpreter session that knows how to deal with `await` expressions. For example, ```console $ python -m asyncio asyncio REPL 3.10.6 [...] on darwin Use "await" directly instead of "asyncio.run()". Type "help", "copyright", "credits" or "license" for more information. >>> import asyncio >>> await asyncio.sleep(1); print("hi") # prints after one second hi ``` This quickly became an important part of my async debugging toolbox. I've also been learning Trio recently, but I've been missing my async console. This PR takes the script from [`asyncio.__main__`][1] and adapts it to use a Trio run loop. With this patch applied, users can run `python -m trio` to drop into an interactive interpreter session that lets them directly `await` Trio-based async expressions. ```console $ python -m trio Trio 0.21.0+dev, Python 3.10.6 [...] on darwin Use "await" directly instead of "trio.run()". Type "help", "copyright", "credits" or "license" for more information. >>> import trio >>> await trio.sleep(1); print("hi") # prints after one second hi ``` [1]: https://github.com/python/cpython/blob/master/Lib/asyncio/__main__.p I'm very new to Trio, so I'm sure my approach is suboptimal. In particular, I'd really appreciate feedback from the team/ community on: - not using `threading` with a brand new `trio.run` to evaluate awaitable expressions. I found that if I simply used `self.nursery.start_soon` in the same thread as `runcode`, `await` expressions wouldn't get the chance to be evaluated until the session was shutting down (might have been blocked by reading keyboard input, if I had to guess). Could there be a solution in `trio`'s threading tools? - what documentation updates should accompany this PR - what sort of tests I should add (since this change implements a brand new code path that won't be touched by any existing or future usage of `trio` itself, I wasn't sure if it would even be appropriate to _try_ and test it) - anything else to align this addition to the Trio way! Many thanks for your consideration.
Codecov ReportAttention:
Additional details and impacted files@@ Coverage Diff @@
## master #2407 +/- ##
==========================================
- Coverage 99.64% 99.37% -0.28%
==========================================
Files 117 118 +1
Lines 17634 17682 +48
Branches 3172 3180 +8
==========================================
Hits 17572 17572
- Misses 43 91 +48
Partials 19 19
|
Adds a section to the end of the reference-core document that notes the existence of this new feature, what it's for, and how to use it. Fixes the broken `:mod:` link from my towncrier entry by instead linking to the new section in reference-core.
Merged
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I recently learned that
python -m asyncio
drops you into aninterpreter session that knows how to deal with
await
expressions. Forexample,
This quickly became an important part of my async debugging toolbox.
I've also been learning Trio recently, but I've been missing my async
console.
This PR takes the script from
asyncio.__main__
and adapts it touse a Trio run loop. With this patch applied, users can run
python -m trio
to drop into an interactive interpreter session that lets themdirectly
await
Trio-based async expressions.I'm very new to Trio, so I'm sure my approach is suboptimal. In
particular, I'd really appreciate feedback from the team/ community on:
threading
with a brand newtrio.run
to evaluateawaitable expressions. I found that if I simply used
self.nursery.start_soon
in the same thread asruncode
,await
expressions wouldn't get the chance to be evaluated until the session
was shutting down (might have been blocked by reading keyboard input,
if I had to guess). Could there be a solution in
trio
's threadingtools?
new code path that won't be touched by any existing or future usage of
trio
itself, I wasn't sure if it would even be appropriate to tryand test it)
Many thanks for your consideration.