-
Notifications
You must be signed in to change notification settings - Fork 225
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
Speed up sliding sync by computing extensions in parallel #17884
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
General idea looks good 👍
Surprised we need extra code
async def gather_optional_coroutines( | ||
*coroutines: Unpack[Tuple[Optional[Coroutine[Any, Any, T1]], ...]], | ||
) -> Tuple[Optional[T1], ...]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm surprised this sort of thing doesn't exist in the API? Like Promise.all(...)
in JavaScript.
Is it because we can't use asyncio
yet?
If it's just a feature-difference on how None
is handled, can we change them from optional coroutines to Promise.resolve(None)
to wrap it in a coroutine (however best to do that in Python) so we're always working with a coroutine?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reason we need to do this manually (rather than using built-ins), is that we need to correctly handle log contexts.
As a quick summary: basically whenever we "fork off" execution of some async code we need to use run_in_background
(or run_as_background_process
if we're not going to later wait on the result), and when we "join" them again we need to use make_deferred_yieldable
. This is basically what gather_optional_coroutines
is doing: spawning the coroutines as background tasks, and then calling make_deferred_yieldable
when waiting on them all to complete
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This context would be useful to read in the docstrings. I see log contexts are mentioned but none of the consequences or why we need to or why we care is included.
The main change here is to add a helper function
gather_optional_coroutines
, which works in a similar way asyieldable_gather_results
but takes a set of coroutines rather than a function