Provides a method for yielding control to the browser, which can be used to break up long tasks. Awaiting the promise returned by scheduler.yield() causes the current task to yield, continuing in a new browser task. This can be used to improve responsiveness issues caused by long tasks. Continuations are prioritized to mitigate performance problems of existing alternatives.
This is a new feature and will not change existing event loop task scheduling, so the main risk is that other browsers might not implement the feature. There is an interop challenge, however, that comes with prioritization: we want to be specific enough to provide developers guarantees and interoperable implementations, but provide enough scheduling flexibility for UAs (like the HTML specification does with task sources/task queues), which we'll keep in mind while drafting the spec (see also https://github.com/WICG/scheduling-apis/issues/67).
The default use (inserting yield points in long tasks) should enable Chrome to maintain better performance (responsiveness). There is a risk of continuations starving other work, but there are reasonable mitigations, e.g. bounding total of prioritized continuations (see also https://github.com/WICG/scheduling-apis/blob/main/explainers/yield-and-continuation.md#preventing-task-starvation-by-continuations).
The feature would benefit from a polyfill so that tasks still yield in the case the feature is unavailable. The behavior can be approximated by awaiting `scheduler.postTask()` or wrapping `setTimeout(0)` in a promise. The signal inheritance bit [1], however, would need transpilation support to propagate the current signal across async (Promise) boundaries. But developers can alternatively pass the appropriate priority/signal if necessary on browsers that don't support the feature.
Does this intent deprecate or change behavior of existing APIs, such that it has potentially high risk for Android WebView-based applications?
None
None.
This has basic new-API devtools support. We plan to work with the devtools team to see if we can integrate continuations into the performance panel in some way.
OriginTrial desktop last | 118 |
OriginTrial desktop first | 115 |
DevTrial on desktop | 113 |
OriginTrial Android last | 118 |
OriginTrial Android first | 115 |
DevTrial on Android | 113 |
OriginTrial webView last | 118 |
OriginTrial webView first | 115 |
LGTM to experiment from 115 to 118 inclusive.
--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAKXGoJ1Uj8nX5HrUT86iZ83YBj%3D6GJ4jnKZKYF3tOq%3D_twN_Yg%40mail.gmail.com.
--
Exciting stuff!!
> The signal inheritance bit [1], however, would need transpilation support to propagate the current signal across async (Promise) boundaries.
I couldn't find where this [1] goes. I'm very interested in this general area, and questions like whether we propagate by default or not, and how robust the propagation is to different mechanisms (e.g., not just promises, but other web platform callbacks as well).What's the latest source of information on that, either in our implementation or in the explainer/spec? I see from the explainer there's a non-default `signal: "inherit"`, but I couldn't find details on how "the current task"'s priority is determined and propagated.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAKXGoJ3kOKppN1cEFr8RkN1T%2ByoEj%2BtLmUTMs5Z9hnLJh6wYUQ%40mail.gmail.com.