plotly / dash

Data Apps & Dashboards for Python. No JavaScript Required.
https://plotly.com/dash
MIT License
21.57k stars 2.08k forks source link

add Callback Throttling #1311

Open chriddyp opened 4 years ago

chriddyp commented 4 years ago

Throttling!

If your UI enables rapid user interaction & updates, then how do you prevent the server or the clientside JS from getting overloaded?

This has come up here and there over the years and we've solved pieces of this puzzle in different ways:

  1. When typing into a dcc.Input, users can prevent every single keypress from updating the callback by using buttons with State or on blur (tabbing or entering) with n_blur & n_submit
  2. In serverside callbacks, if many requests are made at the same time for the same callback, then we'll prune out redundant requests while they're in the queue - https://github.com/plotly/dash/pull/1254

This still laves some use cases:

  1. What if you want to allow keypress updates, but just less frequently?
  2. What about clientside callbacks that don't get the same network request pruning in #1254?
  3. What about components that don't have an equivalent of "blur" or "enter" and aren't well suited for buttons & State? Like hoverData in dcc.Graph

One idea is to solve this in the framework level with:

@app.callback(Output(...), [Input(...)], throttle=500)

This would be the second keyword argument into app.callback. The first was introduced in 1.12.0 with prevent_initial_call=True, see https://github.com/plotly/dash/pull/1228


If any community member is interested in exploring this idea, then see:

  1. https://github.com/plotly/dash/pull/1228 for an example of how to wire callback keyword arguments from the backend up to the frontend
  2. https://github.com/plotly/dash/blob/dev/dash-renderer/src/observers/requestedCallbacks.ts for where callbacks are queued up for requests. Some throttling logic might go in here. See https://github.com/plotly/dash/pull/1254 for some context on the State Machine refactoring
  3. Contributing guide: https://github.com/plotly/dash/blob/dev/CONTRIBUTING.md
  4. After you've made a little progress, please submit a PR early to let us know that you are working on this

Alternatively, this work (and the rest of our work) can be funded by directly by organizations: https://plotly.com/products/consulting-and-oem or prioritized by Dash Enterprise customers.

alexrblohm commented 2 years ago

I am interested in this!

brenoingwersen commented 6 months ago

Just came up to the need. Would be a really cool feature.